android - 单击小部件时播放声音

标签 android android-studio audio widget

这是我的代码,它打开主要 Activity ,但我似乎找不到一种方法来让小部件播放声音。

我尝试过:

  • 向小部件添加按钮(不起作用)
  • OnClickListener 添加到主 Activity (可以工作,但它会打开主 Activity ,我只想要声音而不是 Activity )
  • 编写一个新方法来播放声音,其中包含 MediaPlayer sound.start() 方法并调用它(不起作用)

我查看了 android 开发页面,我所能找到的只是如何使用 MediaPlayer,但它没有说明如何从小部件播放音频。

import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.widget.RemoteViews;



public class ClockWidget extends AppWidgetProvider {

    public static String ACTION_WIDGET_RECEIVER = "ActionReceiverWidget";

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {

        super.onUpdate(context, appWidgetManager, appWidgetIds);

        final int N = appWidgetIds.length;

        for (int i=0; i<N; i++) {
            int appWidgetId = appWidgetIds[i];

            Intent intent = new Intent(context, MainActivity.class);

            intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
            intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

            RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.clock_widget_layout);

            views.setOnClickPendingIntent(R.id.AnalogClock0, pendingIntent);

            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

最佳答案

为此,您需要使用像这样调用的服务

Intent svc=new Intent(this, BackgroundSoundService.class);
startService(svc);

public class BackgroundSoundService extends Service {
    private static final String TAG = null;
    MediaPlayer player;
    public IBinder onBind(Intent arg0) {

        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
        player = MediaPlayer.create(this, R.raw.trck);
       //configure other settings    
    }
    public int onStartCommand(Intent intent, int flags, int startId) {
        player.start();
        return 1;
    }

    public void onStart(Intent intent, int startId) {
        // TO DO
    }
    public IBinder onUnBind(Intent arg0) {
        // TO DO Auto-generated method
        return null;
    }

    public void onStop() {

    }
    public void onPause() {

    }
    @Override
    public void onDestroy() {
        player.stop();
        player.release();
    }

 }

请在Manifest中注册此服务。

<service android:enabled="true" android:name=".BackgroundSoundService" />

你可以在小部件中做这样的事情

public class ClockWidget extends AppWidgetProvider {

    private final String ACTION_WIDGET_PLAY = "PlaySong";
    private final String ACTION_WIDGET_PAUSE = "PauseSong";
    private final String ACTION_WIDGET_STOP = "StopSong";   
    private final int INTENT_FLAGS = 0;
    private final int REQUEST_CODE = 0;

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager,
            int[] appWidgetIds) {

        RemoteViews controlButtons = new RemoteViews(context.getPackageName(),
                R.layout.main);

        Intent playIntent = new Intent(this, BackgroundSoundService.class);

        Intent pauseIntent = new Intent(this, BackgroundSoundService.class);

        Intent stopIntent = new Intent(this, BackgroundSoundService.class);


        PendingIntent playPendingIntent = PendingIntent.getService(
                this, REQUEST_CODE, playIntent, INTENT_FLAGS);
        PendingIntent pausePendingIntent = PendingIntent.getService(
                this, REQUEST_CODE, pauseIntent, INTENT_FLAGS);
        PendingIntent stopPendingIntent = PendingIntent.getService(
                this, REQUEST_CODE, stopIntent, INTENT_FLAGS);

        controlButtons.setOnClickPendingIntent(
                R.id.btnPlay, playPendingIntent);
        controlButtons.setOnClickPendingIntent(
                R.id.btnPause, pausePendingIntent);
        controlButtons.setOnClickPendingIntent(
                R.id.btnStop, stopPendingIntent);

        appWidgetManager.updateAppWidget(appWidgetIds, controlButtons);         
    }
}

关于android - 单击小部件时播放声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49216333/

相关文章:

java - 如何获取稍后使用 addView() 填充的 Linearlayout 的最终高度

c# - 尝试创建表时在 Xamarin.Android 中抛出 SQLite.SQLiteException

android studio "Use gradle wrapper"变灰

windows - 如何在win7中添加 'enhancement'声音过滤器?

audio - 如何使用 Silk 编解码器生成 rtp pcap 文件?

javascript - 合并音频文件 - node js

android - Activity 上的 OnTouchListener

java - 为 Android 中的应用程序制作半透明状态栏

java - 使用java更改FAB( float 操作按钮)srcCompat

android - 通过网络服务向安卓手机发送通知