A great application should provide a function to let users set it as the preferred or default application. In this post, I will make a description on PreferredApplication Before an application is about to be set as default, it has two possibilities. One is that there is already a default application and the other is no default application.
This is really important. It determines what we should do next.
1 2 3 4 5 6 7 | public void testGetDefaultActivity() { PackageManager pm = mContext.getPackageManager(); Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.google.com")); ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY); Log.i(VIEW_LOG_TAG, "getDefaultActivity info = " + info + ";pkgName = " + info.activityInfo.packageName); } |
---|
Result before I set Maxthon Browser as the default one. If no default one is set, the system will call the com.android.internal.app.ResolverActivity
1 | I/View ( 1145 ): View getDefaultActivity info = ResolveInfo{410e4868 com.android.internal.app.ResolverActivity p=0 o=0 m=0x0};pkgName = android |
---|
Result after I set Maxthon Browser as the default one. If the default one is set just call the default activity
1 | I/View ( 1145 ): View getDefaultActivity info = ResolveInfo{410ae1e8 com.mx.browser.MxBrowserActivity p=0 o=0 m=0x208000};pkgName = com.mx.browser |
---|
So it is really clear that you could use the following code to judge.
1 2 | //Use this to determine whether default application is set or not boolean defaultSet = !"android".equals(info.activityInfo.packageName); |
---|
Just remove the preferred settings of the default application. However you could not do this in the code due to the permission control. It’s generally done by users manually. What you could do is lead the user to the clear default page(installedAppDetails)
1 2 3 4 5 | public void testStartAppDetails() { //Use the destination package name Intent intent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:com.mx.browser")); getActivity().startActivity(intent); } |
---|
Then you navigate the user to the installedAppDetails and you could show some tips to click Button Clear Default.
When users go back from installedAppDetails to your application check is there any default appliction now. If the default application(in general, it’s not the previous one) remains repeat the above actions until there is not default one.
Now there is only one step to set ours as the default one. You could not do this in codes. It’s also required manual operation. What you could do is popup the selecting dialog and tip the use select your one.
1 2 3 4 5 6 7 8 | public void testStartChooseDialog() { Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); intent.addCategory("android.intent.category.BROWSABLE"); intent.setData(Uri.parse("http://androidyue.github.io/")); intent.setComponent(new ComponentName("android","com.android.internal.app.ResolverActivity")); getActivity().startActivity(intent); } |
---|
The dialog is like this
What’s more, your tips is really essential. Make sure to notify that “Use by default for this action” should be checked.
1 2 3 4 | public void testClearDefault() { PackageManager pm = mContext.getPackageManager(); pm.clearPackagePreferredActivities(mContext.getPackageName()); } |
---|
Note you could only clear packagePreferredActivities of your own.
the following settings is some content of /data/system/packages.xml
1 2 3 4 5 6 7 8 9 10 11 12 | <preferred-activities> <item name="com.mx.browser/.MxBrowserActivity" match="200000" set="2"> <set name="com.android.browser/.BrowserActivity" /> <set name="com.mx.browser/.MxBrowserActivity" /> <filter> <action name="android.intent.action.VIEW" /> <cat name="android.intent.category.BROWSABLE" /> <cat name="android.intent.category.DEFAULT" /> <scheme name="http" /> </filter> </item> </preferred-activities> |
---|