0

關於此問題,有一百萬個和五個問題,但我試圖對它們進行排序,但無法使其工作。我知道AppWidgetProvider只是擴展BroadcastReceiver,所以我認爲我可以在我的AppWidgetProvider中做所有事情。我讀過意圖過濾器ACTION_HEADSET_PLUG是Intent.FLAG_RECEIVER_REGISTERED_ONLY,並嘗試遵循以下步驟:Detecting whether a headset is plugged into an Android device or not.在代碼中設置我的過濾器,但它非常混亂,我無法圍繞它過濾我的頭。確定是否通過AppWidgetProvider插入耳機,拔下插頭時暫停播放音樂

我已經在我的onReceive方法中烘烤了intent.getAction(),當我插入或拔下耳機時,沒有任何顯示。當我按下按鈕時,我看到與它們相關的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> 

我一直是這樣爭取幾個小時的時間,這似乎很愚蠢,因爲它甚至沒有那麼大的「功能」可以在拔下耳機時暫停音樂。任何指導,你可以分享將不勝感激。

TIA

回答

0

https://stackoverflow.com/a/9682818/1682419行情答案戴安Hackborn(誰是核心Android團隊)。只要您對這些廣播消息感興趣,就需要一個可以保持運行的服務或活動,並且需要撥打registerReceiver()來註冊這些消息。

注1:當你發明意圖的動作,你應該用你自己的名稱,而不是android.intent.action,以避免名稱衝突。

注2:小工具提供商的<intent-filter>應只列出公共行爲android.appwidget.action.APPWIDGET_UPDATE。包含私密點擊操作並沒有好處,並且android.intent.action.ACTION_HEADSET_PLUG

相關問題