android开发步步为营之49:创建APP桌面快捷方式

来源:互联网 发布:上海java培训班 编辑:程序博客网 时间:2024/06/11 19:15


 网上参考过N多的资料,最后发现还是这样写比较靠谱,不会重复创建快捷方式。

     /*
     * 为程序创建桌面快捷方式
     *
     * 同时需要在manifest中设置以下权限: <uses-permission
     * android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
     */
    private void addShortcut(Context cx) {
        if (hasShortCut(cx) == false) {
            try {
                Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
                //有些品牌比如htc的手机使用另外一种方式会重复创建快捷方式
                String brand = android.os.Build.BRAND;
                if (brand.indexOf("htc") != -1) {
                    Intent intent = new Intent(this, AppHomeActivity.class);
                    intent.setAction("com.avazu.lockscreen.ui.activity.AppHomeActivity");
                    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
                }else {
                    Intent shortcutIntent = cx.getPackageManager().getLaunchIntentForPackage(AppHomeActivity.this.getPackageName());
                    shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent);
                }
         
                // 获取当前应用名称
                String title = null;
                try {
                    final PackageManager pm = cx.getPackageManager();
                    title = pm.getApplicationLabel(pm.getApplicationInfo(cx.getPackageName(), PackageManager.GET_META_DATA)).toString();
                } catch (Exception e) {
                }
                // 快捷方式名称
                shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, title);
                // 不允许重复创建(不一定有效)
                shortcut.putExtra("duplicate", false);
                // 快捷方式的图标
                Parcelable iconResource = Intent.ShortcutIconResource.fromContext(cx, R.drawable.ic_launcher);
                shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, iconResource);
                cx.sendBroadcast(shortcut);


                //sharepreference里面判断
                PrefMgr.setBoolean(PrefKey.HAS_CREATE_SHORT_CUT, true);


            } catch (Exception e) {
                if (e != null) {
                    Log.e("hasShortCut", e.getMessage());
                }
            }
        }
    }

 

    //删除快捷方式

    private void delShortcut(){   

            Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");

            //快捷方式的名称   

            shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));   

            

          //这里的intent要和创建时的intent设置一致

            Intent intent = new Intent(this,HomeActivity.class);

            intent.setAction("com.figo.activity.home");

               shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent); 

            sendBroadcast(shortcut); 

        } 


 补充,检查是否已经创建快捷方式,这个方法还是不太靠谱,很多手机不支持,最好还是自己存储,放在sharepreference里面
 public boolean hasShortCut(Context cx) {
       
        //改成自己使用sharePreference
        return PrefMgr.getBoolean(PrefKey.HAS_CREATE_SHORT_CUT, false);
       
//        boolean result = false;
//        // 获取当前应用名称
//        String title = null;
//        try {
//            final PackageManager pm = cx.getPackageManager();
//            title = pm.getApplicationLabel(pm.getApplicationInfo(cx.getPackageName(), PackageManager.GET_META_DATA)).toString();
//
//            String uriStr;
//            if (android.os.Build.VERSION.SDK_INT < 8) {
//                uriStr = "content://com.android.launcher.settings/favorites?notify=true";
//            } else {
//                uriStr = "content://com.android.launcher2.settings/favorites?notify=true";
//            }
//            Uri uri1 = Uri.parse(uriStr);
//            Cursor c1 = cx.getContentResolver().query(uri1, null, "title=?", new String[] { title }, null);
//            if (c1 != null && c1.getCount() > 0) {
//                result = true;
//            } else {
//                uriStr = getAuthorityFromPermission(AppHomeActivity.this, "com.android.launcher.permission.READ_SETTINGS") + "/favorites?notify=true";
//                Uri uri2 = Uri.parse(uriStr);
//                Cursor c2 = cx.getContentResolver().query(uri2, null, "title=?", new String[] { title }, null);
//                if (c2 != null && c2.getCount() > 0) {
//                    result = true;
//                }
//            }

//        } catch (Exception e) {
//            if (e != null) {
//                Log.e("hasShortCut", e.getMessage());
//            }
//        }
//
//        return result;
    }

    private String getAuthorityFromPermission(Context context, String permission) {
        if (permission == null)
            return null;
        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;
    }



配置文件AndroidManifest.xml

权限记得加上

    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />

添加上intent-filter

     <activity

            android:name="com.figo.activity.HomeActivity"

            android:launchMode="singleTask"

            android:screenOrientation="portrait"

            android:theme="@style/Theme.NoTitleBar"

            android:windowSoftInputMode="adjustPan" >

             <intent-filter>

                <action android:name="com.figo.activity.home" />

            </intent-filter>

        </activity>






0 0
原创粉丝点击