0

. Об этом есть миллион и пять вопросов, но я пробовал сортировать их все и не могу заставить его работать. Я знаю, что AppWidgetProvider просто расширяет BroadcastReceiver, так что я думаю Я могу просто сделать все в моем AppWidgetProvider. Я прочитал, что фильтр намерений ACTION_HEADSET_PLUG является Intent.FLAG_RECEIVER_REGISTERED_ONLY и попытался выполнить следующее: Detecting whether a headset is plugged into an Android device or not., чтобы установить мой фильтр в коде, но это было довольно mish-mash, и я не мог обвести вокруг него голову.Определите, подключены ли наушники через AppWidgetProvider, приостановите музыку при отключении от сети.

Я поджарил намерение.getAction() в моем методе onReceive, и когда я подключаю или отсоединяю наушники, ничего не отображается. Однако, когда я нажимаю кнопки, я вижу константу int, связанную с ними. Я предполагаю, что это происходит потому, что он заблокирован зарегистрированным только.

Я также читал о каком-то липчем-чем-то или другом и разворачивался с этим какое-то время, все безрезультатно.

вот мой AppWidgetManager:

package com.example.musicplayerforburrito; 

import android.app.PendingIntent; 
import android.appwidget.AppWidgetManager; 
import android.appwidget.AppWidgetProvider; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.media.MediaPlayer; 
import android.widget.RemoteViews; 
import android.widget.Toast; 




public class MyWidgetProvider extends AppWidgetProvider { 

    public static String WIDGET_PLAY_BUTTON = "android.appwidget.action.PLAY_PAUSE_WIDGETS"; 
    public static String NEXT_BUTTON = "android.appwidget.action.NEXT_WIDGETS"; 
    public static String PREVIOUS_BUTTON = "android.appwidget.action.PREVIOUS_WIDGETS"; 
    public static String RELOAD_BUTTON = "android.appwidget.action.RELOAD_WIDGETS"; 


    static MusicPlayerClass mpc; 
    static String CurrentlyPlayingSong = ""; 
    static Context cont; 

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


     mpc = new MusicPlayerClass(context); 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
     ComponentName watchWidget = new ComponentName(context, MyWidgetProvider.class); 

     remoteViews.setOnClickPendingIntent(R.id.playpausewidget, getPendingSelfIntent(context, WIDGET_PLAY_BUTTON)); 
     remoteViews.setOnClickPendingIntent(R.id.forwardwidget, getPendingSelfIntent(context, NEXT_BUTTON)); 
     remoteViews.setOnClickPendingIntent(R.id.backwidget, getPendingSelfIntent(context, PREVIOUS_BUTTON)); 
     remoteViews.setOnClickPendingIntent(R.id.reloadwidget, getPendingSelfIntent(context, RELOAD_BUTTON)); 
     appWidgetManager.updateAppWidget(watchWidget, remoteViews); 
    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     super.onReceive(context, intent); 
     //if(intent.hasExtra("state")) 
     // Toast.makeText(context, "hi jimmy", 2000).show(); 
     Toast.makeText(context, intent.getAction(), 2000).show(); 

     try 
     { 
      String b = mpc.currentlyPlayingSong; 
     } 
     catch(Exception e) 
     { 
      mpc = new MusicPlayerClass(context); 
     } 
     AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
     RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
     ComponentName watchWidget = new ComponentName(context, MyWidgetProvider.class); 
     cont = context; 
     if (WIDGET_PLAY_BUTTON.equals(intent.getAction())) { 

      if(!mpc.hasFolders) 
      { 
       mpc.Initialize(); 
       mpc.mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
       {   
        public void onCompletion(MediaPlayer mp) 
        { 
         mpc.songIndex++; 
         CurrentlyPlayingSong = mpc.StartSong(); 
         UpdateTitle(cont); 
        }   
       }); 
      } 
      if(mpc.isPlaying) 
      { 
       mpc.isPlaying = false; 
       mpc.PauseMusic(); 
       remoteViews.setImageViewResource(R.id.playpausewidget, R.drawable.play); 
      } 
      else if(mpc.currentPosition != 0) 
      { 
       mpc.isPlaying = true; 
       mpc.ResumeMusic(); 
       remoteViews.setImageViewResource(R.id.playpausewidget, R.drawable.pause);     
      } 
      else 
      { 
       remoteViews.setTextViewText(R.id.mp3filename, mpc.StartSong()); 
       remoteViews.setImageViewResource(R.id.playpausewidget, R.drawable.pause); 
      } 

     } 
     else if (NEXT_BUTTON.equals(intent.getAction())) { 
      mpc.songIndex++; 
      remoteViews.setTextViewText(R.id.mp3filename, mpc.StartSong()); 
     } 
     else if (PREVIOUS_BUTTON.equals(intent.getAction())) { 
      mpc.songIndex--; 
      remoteViews.setTextViewText(R.id.mp3filename, mpc.StartSong()); 
     } 
     else if (RELOAD_BUTTON.equals(intent.getAction())) { 
      mpc.Reload(); 
      mpc.mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() 
      {   
       public void onCompletion(MediaPlayer mp) 
       { 
       mpc.songIndex++; 
       CurrentlyPlayingSong = mpc.StartSong(); 
       UpdateTitle(cont); 
       }   
      }); 
      remoteViews.setTextViewText(R.id.mp3filename, mpc.StartSong()); 
      remoteViews.setImageViewResource(R.id.playpausewidget, R.drawable.pause); 
     } 
     appWidgetManager.updateAppWidget(watchWidget, remoteViews); 
    } 

private void UpdateTitle(Context context) 
{ 
    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); 
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 
    ComponentName watchWidget = new ComponentName(context, MyWidgetProvider.class); 
    remoteViews.setTextViewText(R.id.mp3filename, CurrentlyPlayingSong); 
    appWidgetManager.updateAppWidget(watchWidget, remoteViews);  
} 


    protected PendingIntent getPendingSelfIntent(Context context, String action) { 
     Intent intent = new Intent(context, getClass()); 
     intent.setAction(action); 
     return PendingIntent.getBroadcast(context, 0, intent, 0); 
    } 
} 

вот мой манифест:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.musicplayerforburrito" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="15" 
     android:targetSdkVersion="16" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <receiver android:name="MyWidgetProvider" > 
      <intent-filter > 
       <action 
        android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
       <action android:name="android.appwidget.action.PLAY_PAUSE_WIDGETS" /> 
       <action android:name="android.appwidget.action.NEXT_WIDGETS" /> 
       <action android:name="android.appwidget.action.PREVIOUS_WIDGETS" /> 
       <action android:name="android.appwidget.action.RELOAD_WIDGETS" /> 
       <action android:name="android.appwidget.action.ACTION_HEADSET_PLUG" /> 

      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.ACTION_HEADSET_PLUG"/> 
      </intent-filter> 

      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/widget_info" /> 
     </receiver> 
     <activity 
      android:name="com.example.musicplayerforburrito.MusicPlayer" 
      android:label="@string/app_name" 
      android:screenOrientation="portrait" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

Я боролся с этим в течение буквально часов, что, кажется, действительно глупо, потому что это даже не то, что большой из «функция», чтобы приостановить воспроизведение музыки, когда наушники отсоединены. Любые рекомендации, которые вы можете поделиться, будут очень признательны.

ТИА

ответ

0

Ответ на https://stackoverflow.com/a/9682818/1682419 цитаты Дайан Hackborn (кто в основной команде Android). Вам понадобится служба или активность, которые будут работать, пока вас интересуют эти широковещательные сообщения, и для регистрации этих сообщений необходимо позвонить registerReceiver().

Примечание 1: Когда вы изобрели Intent действия, вы должны использовать собственное имя пакет, а не android.intent.action, чтобы избежать конфликтов имен.

Примечание 2: Поставщик виджета <intent-filter> должны перечислить только общественные действия android.appwidget.action.APPWIDGET_UPDATE. Нет никакой выгоды в том, чтобы включать частные действия по клику и android.intent.action.ACTION_HEADSET_PLUG.