Android设置默认应用程序、清除默认应用程序

来源:互联网 发布:excel2003 重复数据 编辑:程序博客网 时间:2024/06/05 04:37

设置默认应用程序


要将系统默认的WiFi连接程序或者浏览器更改为我们自己的应用,可以通过隐式意图来实现。Intent设置相应的Action,以WiFi为例:

Intent intent = new Intent("android.settings.WIFI_SETTINGS");if (intent.resolveActivity(getPackageManager())) {    startActivity(intent);}

在AndroidManifest.xml里注册IntentFilter:

 <activity android:name="com.***.WiFiActivity">    <intent-filter>        <action android:name="android.settings.WIFI_SETTINGS" />        <category android:name="android.intent.category.DEFAULT" />    </intent-filter></activity>

如果系统存在有多个注册了该类型行为IntentFilter的组件(比如Activity),则会弹出如下图的选择框,让用户选择打开哪个应用。如果用户勾选了“下次不再询问”、“不再提示”的话,那就代表设置该应用为默认的应用程序。

image

ps:Android6.0及以上,无法再设置WiFi类型的默认应用程序,浏览器、桌面等其他类型的应用,可以。

清除默认应用程序


如果用户在此之前已经设置了别的应用为默认的应用程序,但我们想清除掉,让用户重新选择新的默认程序。系统为此提供了个清除默认应用程序的api:

getPackageManager().clearPackagePreferredActivities(packageName);

这是然并卵的,系统级别的APP才具有权限使用。

对于第三方APP,我们只能另辟蹊径了。以设置WiFi默认应用程序为例,实现方法是:先设置一个空的Activity为默认,然后再将该空的Activity禁用,达到清除默认程序的目的。代码如下:

/**     * 清除默认程序并设置默认程序(先设置一个空的Activity为默认,然后再将该空的Activity禁用,达到清除默认程序的目的。)     * <p>     *     Android6.0及以上无法设置wifi默认程序,但设置为默认浏览器等其他类型的,是可以的     */    public void clearDefaultAndSet() {        PackageManager pm = getPackageManager();        String pn = getPackageName();        String hn = FakeActivity.class.getName();        ComponentName cn = new ComponentName(pn, hn);        Intent intent = new Intent("android.settings.WIFI_SETTINGS");        intent.addCategory("android.intent.category.DEFAULT");//      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);        pm.setComponentEnabledSetting(cn, 1, 1);        startActivity(intent);        pm.setComponentEnabledSetting(cn, 0, 1);    }

FakeActivity继承了Activity,没有任何有意义的内容,在AndroidManifest.xml声明并加上IntentFilter即可:

<activity android:name="com.***.FakeActivity"    android:enabled="false" >    <intent-filter>        <action android:name="android.settings.WIFI_SETTINGS" />        <category android:name="android.intent.category.DEFAULT" />    </intent-filter>    </activity>

这样,我们无需任何权限就把默认应用程序给清除了,貌似有点黑科技的感觉。。。

ps:以上是直接清除了默认应用程序,但需求往往都是先判断当前默认应用程序是否为我们自己的应用,如果不是才调用clearDefaultAndSet()方法清除掉。。各位见需使用。

再ps,获取当前默认应用程序的代码如下:

PackageManager pm = getPackageManager();  Intent intent = new Intent("android.settings.WIFI_SETTINGS");  ResolveInfo info = pm.resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);  Log.i(TAG, "当前默认程序的包名pkgName = " + info.activityInfo.packageName);  

未设置默认,info.activityInfo.packageName=android

设置了默认,info.activityInfo.packageName=com.aaa.bbb