標籤:android 捷徑是否存在 添加捷徑 android shortcut isshortcutexist
前兩天做了個應用,需要即時擷取案頭捷徑是否存在,在某些第三方ROM下無法擷取。
網上大量的例子都是Google原生系統或者小米、三星這類系統起作用,但是對於第三方ROM無法擷取如:HTC、華為、一加、聯想。
為什麼不可以,試過的同學應該都知道,我這裡就不一一解答,直接貼正確代碼:
import java.util.List;import android.content.ContentResolver;import android.content.Context;import android.content.Intent;import android.content.pm.PackageInfo;import android.content.pm.PackageManager;import android.content.pm.ProviderInfo;import android.content.pm.ResolveInfo;import android.database.Cursor;import android.net.Uri;import android.text.TextUtils;import android.util.Log;public class launcherUtil {private static String AUTHORITY = null;public static boolean isShortCutExist(Context context, String title) {boolean isInstallShortcut = false;if (null == context || TextUtils.isEmpty(title))return isInstallShortcut;if (TextUtils.isEmpty(AUTHORITY))AUTHORITY = getAuthorityFromPermission(context);final ContentResolver cr = context.getContentResolver();if (!TextUtils.isEmpty(AUTHORITY)) {try {final Uri CONTENT_URI = Uri.parse(AUTHORITY);Cursor c = cr.query(CONTENT_URI, new String[] { "title","iconResource" }, "title=?", new String[] { title },null);// XXX表示應用程式名稱。if (c != null && c.getCount() > 0) {isInstallShortcut = true;}if (null != c && !c.isClosed())c.close();} catch (Exception e) {// TODO: handle exceptionLog.e("isShortCutExist", e.getMessage());}}return isInstallShortcut;}public static String getCurrentLauncherPackageName(Context context) {Intent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);ResolveInfo res = context.getPackageManager().resolveActivity(intent, 0);if (res == null || res.activityInfo == null) {// should not happen. A home is always installed, isn't it?return "";}if (res.activityInfo.packageName.equals("android")) {return "";} else {return res.activityInfo.packageName;}}public static String getAuthorityFromPermissionDefault(Context context) {return getThirdAuthorityFromPermission(context,"com.android.launcher.permission.READ_SETTINGS");}public static String getThirdAuthorityFromPermission(Context context,String permission) {if (TextUtils.isEmpty(permission)) {return "";}try {List<PackageInfo> packs = context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);if (packs == null) {return "";}for (PackageInfo pack : packs) {ProviderInfo[] providers = pack.providers;if (providers != null) {for (ProviderInfo provider : providers) {if (permission.equals(provider.readPermission)|| permission.equals(provider.writePermission)) {if (!TextUtils.isEmpty(provider.authority)// 精準匹配launcher.settings,再一次驗證&& (provider.authority).contains(".launcher.settings"))return provider.authority;}}}}} catch (Exception e) {e.printStackTrace();}return "";}public static String getAuthorityFromPermission(Context context) {// 擷取預設String authority = getAuthorityFromPermissionDefault(context);// 擷取特殊第三方if (authority == null || authority.trim().equals("")) {String packageName = getCurrentLauncherPackageName(context);packageName += ".permission.READ_SETTINGS";authority = getThirdAuthorityFromPermission(context, packageName);}// 還是擷取不到,直接寫死if (TextUtils.isEmpty(authority)) {int sdkInt = android.os.Build.VERSION.SDK_INT;if (sdkInt < 8) { // Android 2.1.x(API 7)以及以下的authority = "com.android.launcher.settings";} else if (sdkInt < 19) {// Android 4.4以下authority = "com.android.launcher2.settings";} else {// 4.4以及以上authority = "com.android.launcher3.settings";}}authority = "content://" + authority + "/favorites?notify=true";return authority;}}
最後別忘了XML裡添加所有許可權
<!-- 捷徑相關 --> <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.android.launcher2.permission.READ_SETTINGS" /> <uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS" /> <uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS" /> <uses-permission android:name="org.adw.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="org.adw.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.htc.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.qihoo360.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.qihoo360.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.lge.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.lge.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="net.qihoo.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="net.qihoo.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="org.adwfreak.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="org.adwfreak.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="org.adw.launcher_donut.permission.READ_SETTINGS" /> <uses-permission android:name="org.adw.launcher_donut.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.huawei.launcher3.permission.READ_SETTINGS" /> <uses-permission android:name="com.huawei.launcher3.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.fede.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.fede.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.sec.android.app.twlauncher.settings.READ_SETTINGS" /> <uses-permission android:name="com.sec.android.app.twlauncher.settings.WRITE_SETTINGS" /> <uses-permission android:name="com.anddoes.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.anddoes.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.tencent.qqlauncher.permission.READ_SETTINGS" /> <uses-permission android:name="com.tencent.qqlauncher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.huawei.launcher2.permission.READ_SETTINGS" /> <uses-permission android:name="com.huawei.launcher2.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.android.mylauncher.permission.READ_SETTINGS" /> <uses-permission android:name="com.android.mylauncher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.ebproductions.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.ebproductions.android.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.lenovo.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.lenovo.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS" /> <uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS" /> <uses-permission android:name="telecom.mdesk.permission.READ_SETTINGS" /> <uses-permission android:name="telecom.mdesk.permission.WRITE_SETTINGS" /> <uses-permission android:name="dianxin.permission.ACCESS_LAUNCHER_DATA" />
Android判斷案頭捷徑是否存在