Android之添加快捷方式(Shortcut)到手机桌面

来源:互联网 发布:广电网络机顶盒安装app 编辑:程序博客网 时间:2024/04/29 20:01

在两个手机上测试,发现小米手机上添加了快捷方式后不能移除,三星手机可以。权限

  要在手机桌面上添加快捷方式,首先需要在manifest中添加权限。

    <!-- 添加快捷方式 -->    <uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />    <!-- 移除快捷方式 -->    <uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT" />    <!-- 查询快捷方式 -->    <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />

添加快捷方式

  添加快捷方式,是向桌面应用(launcher)发送相关action的广播,相关的action如下:

public static final String ACTION_ADD_SHORTCUT = "com.android.launcher.action.INSTALL_SHORTCUT";
<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; line-height: 22.5px;">     添加快捷方式:</span>
<span style="font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 15px; line-height: 22.5px;"></span><pre name="code" class="html">    private void addShortcut(String name) {        Intent addShortcutIntent = new Intent(ACTION_ADD_SHORTCUT);
        // 不允许重复创建        addShortcutIntent.putExtra("duplicate", false);// 经测试不是根据快捷方式的名字判断重复的        // 应该是根据快链的Intent来判断是否重复的,即Intent.EXTRA_SHORTCUT_INTENT字段的value        // 但是名称不同时,虽然有的手机系统会显示Toast提示重复,仍然会建立快链        // 屏幕上没有空间时会提示        // 注意:重复创建的行为MIUI和三星手机上不太一样,小米上似乎不能重复创建快捷方式        // 名字        addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);        // 图标        addShortcutIntent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,                Intent.ShortcutIconResource.fromContext(MainActivity.this,                        R.drawable.ic_launcher));        // 设置关联程序        Intent launcherIntent = new Intent(Intent.ACTION_MAIN);        launcherIntent.setClass(MainActivity.this, MainActivity.class);        launcherIntent.addCategory(Intent.CATEGORY_LAUNCHER);        addShortcutIntent                .putExtra(Intent.EXTRA_SHORTCUT_INTENT, launcherIntent);        // 发送广播        sendBroadcast(addShortcutIntent);    }
或者用xml文件来配置
<pre name="code" class="html" style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;"><?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2009 The Android Open Source Project     Licensed under the Apache License, Version 2.0 (the "License");     you may not use this file except in compliance with the License.     You may obtain a copy of the License at          http://www.apache.org/licenses/LICENSE-2.0     Unless required by applicable law or agreed to in writing, software     distributed under the License is distributed on an "AS IS" BASIS,     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.     See the License for the specific language governing permissions and     limitations under the License.--><favorites xmlns:launcher="http://schemas.android.com/apk/res-auto">    <!-- screen [0] -->    <!-- 内部小部件使用uri域(对应数据库中的intent)保存Widget名称 -->    <simple_widget        launcher:uri="com.sangfor.widget.Clock"        launcher:screen="0"        launcher:x="0"        launcher:y="0"        launcher:spanX="4"        launcher:spanY="1"        launcher:movable="false"        />    <simple_widget        launcher:uri="com.sangfor.widget.Tips"        launcher:screen="0"        launcher:x="0"        launcher:y="1"        launcher:spanX="4"        launcher:spanY="1"        launcher:movable="false"        />    <shortcut        launcher:uri="#Intent;action=com.sangfor.action.ACTION_EXIT_SECURE_WORKSPACE;launchFlags=0x10200000;component=com.sangfor.vpn.client.awork/com.sangfor.vpn.client.launcher.HandlerActivity;end"        launcher:iconRes="@drawable/ic_exit_secure_workspace"        launcher:titleRes="@string/exit_secure_workspace"        launcher:container="-100"        launcher:screen="0"        launcher:x="0"        launcher:y="2"        launcher:deletable="false" />    <shortcut        launcher:uri="#Intent;action=android.intent.action.MAIN;launchFlags=0x10200000;component=com.sangfor.vpn.client.awork/com.sangfor.vpn.client.phone.appstore.AppStoreActivity;end"        launcher:iconRes="@drawable/ic_appstore"        launcher:titleRes="@string/appstore_title"        launcher:container="-100"        launcher:screen="0"        launcher:x="1"        launcher:y="2"        launcher:deletable="false" />                <!-- Hotseat (We use the screen as the position of the item in the hotseat) -->    <resolve        launcher:container="-101"        launcher:screen="0"        launcher:x="0"        launcher:y="0"        launcher:iconRes="@drawable/ic_dialer_app"        launcher:titleRes="@string/dial_shortcut_title"        launcher:deletable="false">        <favorite launcher:uri="#Intent;action=android.intent.action.DIAL;end" />        <favorite launcher:uri="tel:123" />        <favorite launcher:uri="#Intent;action=android.intent.action.CALL_BUTTON;end" />        <favorite            launcher:packageName="com.android.dialer"            launcher:className="com.android.dialer.DialtactsActivity" />    </resolve>    <resolve        launcher:container="-101"        launcher:screen="1"        launcher:x="1"        launcher:y="0"        launcher:iconRes="@drawable/ic_contacts_app"        launcher:titleRes="@string/contacts_shortcut_title"        launcher:deletable="false">        <favorite launcher:uri="content://contacts/people" />    </resolve>    <resolve        launcher:container="-101"        launcher:screen="2"        launcher:x="2"        launcher:y="0"        launcher:iconRes="@drawable/ic_sms_app"        launcher:titleRes="@string/sms_shortcut_title"        launcher:deletable="false">        <favorite            launcher:uri="#Intent;action=android.intent.action.MAIN;category=android.intent.category.APP_MESSAGING;end" />        <favorite            launcher:packageName="com.android.contacts"            launcher:className="com.android.mms.ui.ComposeMessageActivity" />        <favorite launcher:uri="sms:" />        <favorite launcher:uri="smsto:" />        <favorite launcher:uri="mms:" />        <favorite launcher:uri="mmsto:" />        <favorite            launcher:packageName="com.android.mms"            launcher:className="com.android.mms.ui.ConversationList" />    </resolve>        <shortcut        launcher:uri="#Intent;action=com.sangfor.action.ACTION_OPEN_CONSOLE_SETTINGS;category=android.intent.category.DEFAULT;end"        launcher:iconRes="@drawable/ic_setting_app"        launcher:titleRes="@string/setting_shortcut_title"        launcher:container="-101"        launcher:screen="3"        launcher:x="3"        launcher:y="0"        launcher:deletable="false" /></favorites>

移除快捷方式

  移除快捷方式的action:

public static final String ACTION_REMOVE_SHORTCUT = "com.android.launcher.action.UNINSTALL_SHORTCUT";
移除快捷方式的方法:
private void removeShortcut(String name) {        // remove shortcut的方法在小米系统上不管用,在三星上可以移除        Intent intent = new Intent(ACTION_REMOVE_SHORTCUT);        // 名字        intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, name);        // 设置关联程序        Intent launcherIntent = new Intent(MainActivity.this,                MainActivity.class).setAction(Intent.ACTION_MAIN);        intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, launcherIntent);        // 发送广播        sendBroadcast(intent);    }
在两个手机上测试,发现小米手机上添加了快捷方式后不能移除,三星手机可以。

查询快捷方式

  查询快捷方式是否存在的方法是从网上其他资料那里查来的,但是测试查询的时候失败了,两个手机(小米、三星)都查不到。

  先留着代码以后看看是什么原因吧:

private boolean hasInstallShortcut(String name) {        boolean hasInstall = false;        final String AUTHORITY = "com.android.launcher2.settings";        Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY                + "/favorites?notify=true");        // 这里总是failed to find provider info        // com.android.launcher2.settings和com.android.launcher.settings都不行        Cursor cursor = this.getContentResolver().query(CONTENT_URI,                new String[] { "title", "iconResource" }, "title=?",                new String[] { name }, null);        if (cursor != null && cursor.getCount() > 0) {            hasInstall = true;        }        return hasInstall;    }


参考资料1:http://www.cnblogs.com/felix-hua/archive/2011/12/30/2307199.html
参考资料2:http://www.cnblogs.com/felix-hua/archive/2011/12/30/2307327.html
参考资料3:http://blog.csdn.net/error/404.html?from=http://blog.csdn.net/ldj299/article/details/6298452
参考资料4:http://www.cnblogs.com/CoolPigs/p/3317234.html

</pre><pre code_snippet_id="1583491" snippet_file_name="blog_20160220_11_9472260" name="code" class="html" style="font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 25.2px;">

1 0
原创粉丝点击