Last active
August 29, 2015 14:17
-
-
Save danielgomezrico/44f081fbdf7ed1f176f1 to your computer and use it in GitHub Desktop.
Fix Service Intent must be explicit for Android V21 http://blog.android-develop.com/2014/10/android-l-api-21-javalangillegalargumen.html
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import android.content.ComponentName; | |
import android.content.Context; | |
import android.content.Intent; | |
import android.content.pm.PackageManager; | |
import android.content.pm.ResolveInfo; | |
import java.util.List; | |
/** | |
* Created by danielgomez22 on 3/14/15. | |
* based on http://blog.android-develop.com/2014/10/android-l-api-21-javalangillegalargumen.html | |
*/ | |
public class IntentHelper { | |
/** | |
* Android L (lollipop, API 21) introduced a new problem when trying to invoke implicit intent, | |
* "java.lang.IllegalArgumentException: Service Intent must be explicit" | |
* <p/> | |
* 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. | |
* <p/> | |
* 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 static Intent createExplicitFromImplicitIntent(Context context, Intent implicitIntent) { | |
// Retrieve all services that can match the given intent | |
PackageManager pm = context.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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment