【Android】判斷捷徑是否存在——相容性更強(速度提升12倍),android12倍

來源:互聯網
上載者:User

【Android】判斷捷徑是否存在——相容性更強(速度提升12倍),android12倍
1原理:這個是在2.3的時候無意發現的,當我照著網上的例子查詢捷徑是否建立的時候突然應用程式掛了,說是缺少許可權。

com.android.launcher.permission.READ_SETTINGS或者com.android.launcher.permission.WRITE_SETTINGS

然後我就添加了許可權,雖然是可以判斷了,但是小米,HTC等手機都不能正常使用,這時候突然發現了網上了一段代碼,才明白了網友們的想法,現在就來簡單分析下,並做出最佳化。

String url = "content://" + authority + "/favorites?notify=true";

其實判斷捷徑也就是根據這個ContentProvider來判斷。但是我們並不知道這個authority,那麼怎麼知道呢?查詢,根據PackageManager得到ProviderInfo,然後判斷ProviderInfo的讀寫權限是否包含com.android.launcher.permission.READ_SETTINGS或者com.android.launcher.permission.WRITE_SETTINGS。

至此原理我們已經明白了。

2解決方案:1這是網上通用的寫法:
public static boolean hasShortcut(Context context, String appName) {String readSettingsPermission = "com.android.launcher.permission.READ_SETTINGS";String authority = getAuthorityFromPermission2(context, readSettingsPermission);String url = "content://" + authority + "/favorites?notify=true";final Uri CONTENT_URI = Uri.parse(url);Cursor c = context.getContentResolver().query(CONTENT_URI, null, " title= ? ", new String[] { appName }, null);if (c != null && c.moveToNext()) {return true;}return false;}@SuppressLint("NewApi")private static String getAuthorityFromPermission2(Context context, String permission) {List<PackageInfo> packs = context.getPackageManager().getInstalledPackages(PackageManager.GET_PROVIDERS);if (packs != null) {for (PackageInfo pack : packs) {ProviderInfo[] providers = pack.providers;if (providers != null) {for (ProviderInfo provider : providers) {if (permission.equals(provider.readPermission))return provider.authority;if (permission.equals(provider.writePermission))return provider.authority;}}}}return null;}

2這是我自己想的方法,雖然思路走到一起了,但是多少有點出入:
public static boolean hasShortcut(Context context, String appName) {String readSettingsPermission = "com.android.launcher.permission.READ_SETTINGS";String authority = getAuthorityFromPermission1(context, readSettingsPermission);String url = "content://" + authority + "/favorites?notify=true";final Uri CONTENT_URI = Uri.parse(url);Cursor c = context.getContentResolver().query(CONTENT_URI, null, " title= ? ", new String[] { appName }, null);if (c != null && c.moveToNext()) {return true;}return false;}private static String getAuthorityFromPermission1(Context context, String permission) {ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<RunningAppProcessInfo> appProcessInfos = am.getRunningAppProcesses();for (int i = 0; i < appProcessInfos.size(); i++) {RunningAppProcessInfo appInfo = appProcessInfos.get(i);List<ProviderInfo> info = context.getPackageManager().queryContentProviders(appInfo.processName, appInfo.uid, PackageManager.GET_PROVIDERS);if (info != null) {for (int j = 0; j < info.size(); j++) {ProviderInfo provider = info.get(j);if (permission.equals(provider.readPermission)) {return provider.authority;}if (permission.equals(provider.writePermission)) {return provider.authority;}}}}return null;}
3這是最後一個版本,速度又提升了20%,而且相容性更強。記得加下許可權。
public static boolean hasShortcut(Context context, String appName) {long start = System.currentTimeMillis();String authority = getAuthorityFromPermission(context);if (authority == null) {return false;}long end = System.currentTimeMillis() - start;Log.e("Finals", end + "  eee");String url = "content://" + authority + "/favorites?notify=true";try {Uri CONTENT_URI = Uri.parse(url);Cursor c = context.getContentResolver().query(CONTENT_URI, null, " title= ? ", new String[] { appName }, null);if (c != null && c.moveToNext()) {return true;}} catch (Exception e) {}return false;}private static String getAuthorityFromPermission(Context context) {// 先得到預設的LauncherIntent intent = new Intent(Intent.ACTION_MAIN);intent.addCategory(Intent.CATEGORY_HOME);PackageManager mPackageManager = context.getPackageManager();ResolveInfo resolveInfo = mPackageManager.resolveActivity(intent, 0);if (resolveInfo == null) {return null;}List<ProviderInfo> info = mPackageManager.queryContentProviders(resolveInfo.activityInfo.packageName, resolveInfo.activityInfo.applicationInfo.uid, PackageManager.GET_PROVIDERS);if (info != null) {for (int j = 0; j < info.size(); j++) {ProviderInfo provider = info.get(j);if (provider.readPermission == null) {continue;}if (Pattern.matches(".*launcher.*READ_SETTINGS", provider.readPermission)) {return provider.authority;}}}return null;}

這是常用的各種案頭的許可權:

    <!-- 捷徑許可權 -->

    <uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.android.launcher2.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.android.launcher3.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="org.adw.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.htc.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.qihoo360.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.lge.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="net.qihoo.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="org.adwfreak.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="org.adw.launcher_donut.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.huawei.launcher3.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.fede.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.sec.android.app.twlauncher.settings.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.anddoes.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.tencent.qqlauncher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.huawei.launcher2.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.android.mylauncher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.ebproductions.android.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.oppo.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.lenovo.launcher.permission.READ_SETTINGS"/>

    <uses-permissionandroid:name="com.huawei.android.launcher.permission.READ_SETTINGS"/>



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.