首页 > 代码库 > 0501-APP-launcher-shortcut

0501-APP-launcher-shortcut

判断shutcut是否安装

<!-- 需要权限 -->

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

这段代码在模拟器上运行没有问题,但是在htc s510e运行报异常Failed to find provider info for com.android.launcher2.settings

通过但因htc所有包发现htc中的launcher被定制了改名为com.htc.launcher,所以这一段代码的通用行很差一般不对shortCut进行判断都是直接添加

    public boolean isAddShortCut() {

        boolean isInstallShortcut = false;
        final ContentResolver cr = this.getContentResolver();

        int versionLevel = android.os.Build.VERSION.SDK_INT;
        String AUTHORITY = "com.android.launcher2.settings";
       
        //2.2以上的系统的文件文件名字是不一样的
        if (versionLevel >= 8) {
            AUTHORITY = "com.android.launcher2.settings";
        } else {
            AUTHORITY = "com.android.launcher.settings";
        }

        final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
                + "/favorites?notify=true");
        Cursor c = cr.query(CONTENT_URI,
                new String[] { "title", "iconResource" }, "title=?",
                new String[] { getString(R.string.app_name) }, null);

        if (c != null && c.getCount() > 0) {
            isInstallShortcut = true;
        }
        return isInstallShortcut;
    }

创建shortcut在桌面快捷方式只要加入

action android:name="android.intent.action.CREATE_SHORTCUT" />

  <activity android:name=".Activity01"
                  android:label="@string/app_name">
            <intent-filter>
         
			<action android:name="android.intent.action.CREATE_SHORTCUT" /> 
            </intent-filter>
        </activity>
    </application>

当点击shotcutList中的此shortcut则会打开这个Activity执行下面的代码


public class Activity01 extends Activity
{
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Intent addShortcut;
        Log.e("-----------------------", getIntent().getAction()+" : "+Intent.ACTION_CREATE_SHORTCUT);
        if (getIntent().getAction().equals(Intent.ACTION_CREATE_SHORTCUT))
        {
            addShortcut = new Intent();
            addShortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "发送邮件");
            Parcelable icon = Intent.ShortcutIconResource.fromContext(this,R.drawable.mail_edit);  
            addShortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,icon);
            Intent mailto = new  Intent(Intent.ACTION_SENDTO, Uri.parse( "mailto:xxx@xxx.com" ));
            addShortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, mailto);  
            setResult(RESULT_OK,addShortcut);  
        }
        finish();  
    }
}



直接添加shortcut到桌面:同样这给方法在模拟器上添加成功但是在HTC S510e验证失败,应该也是HTC订制导致的,
查看android的源码了解到icon的添加(也就是在里面的icon列表)和shortcut的添加都是通过recevier来接受通知的,但是他定义的Action:

 public static final String ACTION_INSTALL_SHORTCUT ="com.android.launcher.action.INSTALL_SHORTCUT";

我怀疑可能是htc的这个值出现了变化

权限声明

uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"

Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT");
        // 设置属性
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, "sdjkdsf");
        ShortcutIconResource iconRes = Intent.ShortcutIconResource.fromContext(this.getApplicationContext(), R.drawable.ic_launcher);
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON,iconRes);
 
        // 是否允许重复创建
        shortcut.putExtra("duplicate", false);
       
        //设置桌面快捷方式的图标
        Parcelable icon = Intent.ShortcutIconResource.fromContext(this,R.drawable.ic_launcher);       
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE,icon);
       
        //点击快捷方式的操作
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
        intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        intent.setClass(ShortcutActivity.this, ShortcutActivity.class);
       
        // 设置启动程序
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
       
        //广播通知桌面去创建
        this.sendBroadcast(shortcut);

删除shortcut的代码和权限声明

uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"

Intent shortcut = new Intent("com.android.launcher.action.UNINSTALL_SHORTCUT");  
               
        //快捷方式的名称  
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, getString(R.string.app_name));  
        String appClass = this.getPackageName() + "." +this.getLocalClassName();  
        ComponentName comp = new ComponentName(this.getPackageName(), appClass);  
        shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, new Intent(Intent.ACTION_MAIN).setComponent(comp));  
               
        sendBroadcast(shortcut);  


如果有直接添加shortcut的方法且通用行很好的,希望赐教一下