2016-07-20 2 views
0

Я понимаю принципы неявных/явных намерений, но я не могу создать явное намерение со следующего кода:Как создать явное намерение

 getActivity().startService(new Intent(PowerampAPI.ACTION_API_COMMAND) 
     .putExtra(PowerampAPI.COMMAND, PowerampAPI.Commands.OPEN_TO_PLAY) 
     .setData(PowerampAPI.ROOT_URI.buildUpon() 
       .appendEncodedPath("folder_playlist_entries") 
       .appendEncodedPath(playlist_id) 
       .appendEncodedPath("files") 
       .build())); 

Выполнение этого кода дает следующую ошибку:

.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.maxmpz.audioplayer.API_COMMAND dat=content://com.maxmpz.audioplayer.data/folder_playlist_entries/5/files (has extras) }

Вопрос: Как превратить это в явное намерение?

+0

Следующая ссылка может помочь вам: http://stackoverflow.com/a/5940841/5372087 вам просто нужно добавить пристальный фильтр, содержащий этот пакет приложений имя thayou хотите позвонить –

+0

спасибо Bhoomit, там много предложений по ссылке. Мне придется потратить некоторое время на их изучение. – Theo

ответ

0

Я понимаю, что вы пытаетесь запустить сервис. Если это так, то вы должны будете предоставить два аргумента для нового Intent(), как это:

startService(new Intent(this, service.class)); 

Такой decleration обеспечивает явное намерение к методу StartService.

Вы можете Furthur см ато эту ссылку о службе и как запустить службу:

https://developer.android.com/reference/android/content/Context.html#startService(android.content.Intent)

+0

Здесь лежит моя проблема. Я прочитал всю эту информацию на developer.android.com, но я не мудрее. В вашем примере, какой сервис.class будет предоставлен код, который я представляю? – Theo

0

попробовать это, он может помочь.

Intent i = new Intent("com.maxmpz.audioplayer"); 
i.putExtra(PowerampAPI.COMMAND, PowerampAPI.Commands.OPEN_TO_PLAY); 
i.setData(PowerampAPI.ROOT_URI.buildUpon() 
       .appendEncodedPath("folder_playlist_entries") 
       .appendEncodedPath(playlist_id) 
       .appendEncodedPath("files") 
       .build()); 
startService(i); 
+0

Спасибо, но никаких изменений, служебное намерение должно быть явным: Intent {act = com.maxmpz.audioplayer dat = content: //com.maxmpz.audioplayer.data/folder_playlist_entries/3/files (есть дополнительные функции) – Theo

0

Я нашел фрагмент кода, который превращает неявное намерение в явное. Источник: http://blog.android-develop.com/2014/10/android-l-api-21-javalangillegalargumen.html

 Intent intent = new Intent(PowerampAPI.ACTION_API_COMMAND); 
     intent.putExtra(PowerampAPI.COMMAND, PowerampAPI.Commands.OPEN_TO_PLAY) 
       .setData(PowerampAPI.ROOT_URI.buildUpon() 
       .appendEncodedPath("playlists") 
       .appendEncodedPath(playlist_id) 
       .appendEncodedPath("files") 
       .build()); 
Intent explicit_intent = new Intent(createExplicitFromImplicitIntent(getActivity(), intent)); 
getActivity().startService(explicit_intent); 

и

 /*** 
* Android L (lollipop, API 21) introduced a new problem when trying to invoke implicit intent, 
* "java.lang.IllegalArgumentException: Service Intent must be explicit" 
* 
* If you are using an implicit intent, and know only 1 target would answer this intent, 
* This method will help you turn the implicit intent into the explicit form. 
* 
* Inspired from SO answer: http://stackoverflow.com/a/26318757/1446466 
* @param context 
* @param implicitIntent - The original implicit intent 
* @return Explicit Intent created from the implicit original intent 
*/ 
public Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) { 
    // Retrieve all services that can match the given intent 
    PackageManager pm = getActivity().getPackageManager(); 
    List<ResolveInfo> resolveInfo = pm.queryIntentServices(implicitIntent, 0); 

    // Make sure only one match was found 
    if (resolveInfo == null || resolveInfo.size() != 1) { 
     return null; 
    } 

    // Get component info and create ComponentName 
    ResolveInfo serviceInfo = resolveInfo.get(0); 
    String packageName = serviceInfo.serviceInfo.packageName; 
    String className = serviceInfo.serviceInfo.name; 
    ComponentName component = new ComponentName(packageName, className); 

    // Create a new intent. Use the old one for extras and such reuse 
    Intent explicitIntent = new Intent(implicitIntent); 

    // Set the component to be explicit 
    explicitIntent.setComponent(component); 

    return explicitIntent; 
} 
Смежные вопросы