10

Я бы хотел увидеть мое приложение в списке игроков («продолжить действие, используя ...»), которое появляется, когда я пытаюсь открыть аудиофайл (т. Е. Из файлового браузера или вложения gmail). Вот умысел фильтры, которые я пробовал на мой MainActivity:зарегистрируйтесь как музыкальный плеер

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

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

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

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

    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.CATEGORY_APP_MUSIC" /> 
    </intent-filter> 

    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <data android:mimeType="audio/mpeg" /> 
    </intent-filter> 

спасибо за вашу помощь!

+0

эй этот ответ работал хорошо для меня. Но когда я выбираю песню и выбираю свое приложение из списка, оно успешно открывает мое приложение, но не воспроизводит выбранную песню. что делать для этого? пожалуйста помоги! – 2016-11-01 13:26:42

ответ

13

Вы всегда нужен <category> на качестве <activity><intent-filter>, так как всегда существует по крайней мере одна категория на Intent используется с startActivity().

Вот что the AOSP Music приложение uses:

 <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <data android:scheme="file"/> 
      <data android:mimeType="audio/*"/> 
      <data android:mimeType="application/ogg"/> 
      <data android:mimeType="application/x-ogg"/> 
      <data android:mimeType="application/itunes"/> 
     </intent-filter> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="http" /> 
      <data android:mimeType="audio/*"/> 
      <data android:mimeType="application/ogg"/> 
      <data android:mimeType="application/x-ogg"/> 
      <data android:mimeType="application/itunes"/> 
     </intent-filter> 
     <intent-filter 
      android:priority="-1"> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="content" /> 
      <data android:mimeType="audio/*"/> 
      <data android:mimeType="application/ogg"/> 
      <data android:mimeType="application/x-ogg"/> 
      <data android:mimeType="application/itunes"/> 
     </intent-filter> 
+0

Два вопроса ... Что делать, если мы хотим быть стандартными для mp3-файлов ... не все аудиофайлы ... и вопрос два, как мы можем получить информацию о файле/путь в Activity? – DeNitE

+0

@DeNitE: «Что делать, если мы хотим быть стандартными для mp3-файлов» - вы не станете ничем по умолчанию, если пользователь не захочет сделать вас по умолчанию. Пользователь может выбрать для вас значение по умолчанию для любой структуры «Intent», которую вы выбираете для поддержки через ваш набор элементов ''. «как мы получим информацию о файле/путь в Activity?» - вызовите 'getIntent()' для извлечения «Intent», который использовался для запуска вашей активности. Это не будет файл, обычно (скорее всего, 'content:' схема). – CommonsWare

+0

хорошо, это имеет смысл ... позвольте мне перефразировать ... что мы только хотели предоставить поддержку только для mp3-файлов, а не для всех аудиофайлов? – DeNitE

4

Это работает для меня:

AndroidManifest:

<intent-filter> 
      <action android:name="android.intent.action.VIEW"/> 
      <category android:name="android.intent.category.DEFAULT"/> 
      <data android:scheme="file" android:pathPattern=".*mp3" android:mimeType="audio/mpeg" /> 
</intent-filter> 

MainActivity:

@Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 

    if (Intent.ACTION_VIEW.equals(getIntent().getAction())) 
    { 
     File file = new File(getIntent().getData().getPath()); 

     // do what you want with the file...  
    } 
0

Это работает для меня

<intent-filter> 
    <action android:name="android.intent.action.VIEW"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <category android:name="android.intent.category.BROWSABLE"/> 
    <data android:scheme="content"/> 
    <data android:scheme="file"/> 
    <data android:mimeType="application/x-flac"/> 
    <data android:mimeType="audio/*"/> 
    <data android:mimeType="application/ogg"/> 
    <data android:mimeType="application/x-ogg"/> 
    <data android:mimeType="application/itunes"/> 
</intent-filter> 
0

CommonsWare ответ о манифесте хорошо, и это работает.

«Но когда я выбираю песню и выбрать мое приложение из списка, он открывает мое приложение успешно, но не играть в эту выбранную песню. Что делать для этого ??»

Если ваше приложение не в фоновом режиме, в Ваша деятельность OnCreate вы можете сделать

Uri data = getIntent().getData() 
if (data!=null){/*use this Uri like you want*/} 

в случае ваше приложение находится в фоновом режиме намерения вы должны перехватывать будет проходить через метод onNewIntent(), что вы должны ovveride.

Вот полный пример кода:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    /*...*/ 
    interceptExternalIntentAndPlaySongFromUri(getIntent()); 
} 

@Override 
protected void onNewIntent(Intent intent) { 
    interceptExternalIntentAndPlaySongFromUri(intent); 
} 

private boolean interceptExternalIntentAndPlaySongFromUri(Intent intent){ 
    Uri data = intent.getData(); 
    if (data != null && intent.getAction() != null && 
intent.getAction().equals(Intent.ACTION_VIEW)){  
     String scheme = data.getScheme(); 
     String filename = ""; 
     if ("file".equals(scheme)) { 
      filename = data.getPath(); 
     } else { 
      filename = data.toString(); 
     } 
     player.setDataSource(filename); 
     setIntent(new Intent());  //this is to remove the last intent 
//without the above line, last request is reloaded when the user open another app 
//and return in this 
     return true;  //has intercepted an external intent. so you can load this uri. 
    } 
    return false;   //has not intent to intercept 
}