Можно ли использовать MediaPlaybackservice для получения информации о воспроизводимом в данный момент аудиофайле в Android? - PullRequest
0 голосов
/ 16 февраля 2012

Я написал класс, который будет обрабатывать MediaPlaybackService в Android.Но код не работает.

Мой код для привязки serviceconnection выглядит следующим образом:

Intent in = new Intent();                                              
  in.setClassName("com.android.playerapps","com.android.playerapps.MediaPlayerServiceConnection");
  ServiceConnection conn = new MediaPlayerServiceConnection();
  ctx.bindService(in, conn, 0);                 

Класс ServiceConnection выглядит следующим образом:

public class MediaPlayerServiceConnection implements ServiceConnection {
IMediaPlaybackService mService; 
public void onServiceConnected(ComponentName name, IBinder service) {
    Log.i("MediaPlayerServiceConnection", "Connected! Name: " +name.getClassName());    

    // This is the important line
    mService = IMediaPlaybackService.Stub.asInterface(service);
    // Process org.videolan.vlc.android with component org.videolan.vlc.android.AudioService
     System.out.println( "---------------- track:");

    // If all went well, now we can use the interface
    try {       

        if (mService.isPlaying())
        { 
            //String str=getTrackName();    

            //String str=Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath()+"/"+mService.getPath();
            System.out.println( "Playing track: "+this.getTrackName());
            Log.i("MediaPlayerServiceConnection", "Music player is playing.");
        } 
        else 
        {
            Log.i("MediaPlayerServiceConnection", "Music player is not playing.");
        }
    } 
    catch (Exception e) {
        e.printStackTrace();
        //throw new RuntimeException(e);
    }
}

public void onServiceDisconnected(ComponentName name) {
    Log.i("MediaPlayerServiceConnection", "Disconnected!");
}

public String getTrackName() {
    try {
        return ( mService.getTrackName() );
    } catch (RemoteException e) {
        Log.e("MediaConnection", "Failed to get TrackName");
        return "Failed to get TrackName";
    }           
}

Plz help!!

1 Ответ

3 голосов
/ 16 мая 2012

Две проблемы здесь:

1 - IMediaPlaybackService недоступен из других приложений. Это связано с тем, что этот сервис не экспортируется в файл манифеста приложения Music с Gingerbread (Android 2.3) (см. packages/apps/Music/AndroidManifest.xml в исходном коде Android):

<service android:name="com.android.music.MediaPlaybackService" 
    android:exported="false" />

Когда значение равно false, только компоненты одного и того же приложения или приложения с одинаковым идентификатором пользователя могут запускать службу или связываться с ней.

Приложение «Музыка» может быть перестроено с изменением атрибута XML на true и повторной установкой на устройстве, но это приведет к проблеме № 2

2 - MediaPlaybackService является частью встроенного приложения Android Music и используется только внутри этого приложения. Если на устройстве установлен сторонний музыкальный проигрыватель, он не будет использовать MediaPlaybackService, и никакая информация о воспроизведении не будет доступна через его API.

К сожалению, ни одна общедоступная системная служба не предоставляет такой же API для получения доступа к информации о текущей аудиодорожке или для взаимодействия с текущим воспроизведением.

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

...