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:[email protected]" ));
            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的方法且通用行很好的,希望赐教一下

0501-APP-launcher-shortcut,布布扣,bubuko.com

时间: 2024-10-29 22:59:31

0501-APP-launcher-shortcut的相关文章

Android Launcher浅析(二)

1,如何修改主菜单图标的位置? [DESCRIPTION] 默认主菜单图标在中间,如何修改它的位置? Launcher3: DynamicGrid.java文件 hotseatAllAppsRank = (int) (numColumns/2); //默认是列数除以2取整,可以设置为需要的值 Launcher2: 1. 请修改packages/apps/Laucher2/res/values/config.xml 中hotseat_all_apps_index的值,例如修改为1 2. 默认在ho

API Guide:APP组件-意图和意图过滤器(一)

注意:本人非专业翻译人员,编写此博客只是为了自学使用,如有疑问,请参考官方文档. 意图是一个消息对象,您可以使用它从其他应用程序组件请求操作. 虽然意图通过几种方式促进组件之间的通信,但有三种基本用途: 1.启动一个活动: 活动表示应用程序中的单个屏幕. 您可以通过将Intent传递给startActivity()来启动活动的新实例. 意图描述启动的活动并携带任何必要的数据. 如果要在活动结束后收到结果,请调用startActivityForResult().在活动的onActivityResu

Android官方文档之App Components(Intents and Intent Filters)

Android应用框架鼓励开发者在开发应用时重用组件,本文将阐述如何用组件构建应用程序以及如何用intent将组件联系起来. 如需阅读官方原文,请您点击这个链接: <App Components>. 您还可以参考这些博文: <Using DialogFragments> <Fragments For All> <Multithreading For Performance> 以及这些Training: <Managing the Activity Li

Android中源码Launcher主屏幕程序排列详解【安卓Launcher进化一】

最近研究Lancher,从短信Mms的框架中过度到Launcher的bug和需求修改中,下面对launcher最简单的主屏幕程序的程序的布局的详 解,给读者一个入门的感觉,android的主屏幕一共分为5个屏幕,从左到右依次是:0,1,2,3,4.所以想在那个主屏幕放哪些程序或者 widget都可以在布局文件中实现,下面我就说说这个布局文件default_workspace.xml.这是对主屏幕进行排列的布局文件,在这里面 写好,程序运行后就可以实现哪个屏幕放那些特定的程序或widget了.下面

HandlerThread应用(对比AsyncTask)

之前说过HandlerThread的原理:: Handler机制的分发中心就在Looper中的loop(),HandlerThread将loop转到子线程中处理,降低了主线程的压力,使主界面更流畅 其实说白了,创建HandlerThread,只是为了用此线程的looper  最终的runnable都还是post到主线程运行(已用Toast测试过) 最终的最终就是降低了Loop中的loop功耗,依旧在主线程中运行. 这里我以Launcher2的代码来说说HandlerThread的具体应用:: /

Ubuntu 下安装GIMP

1.Add GIMP PPA Open terminal from Unity Dash, App launcher, or via Ctrl+Alt+T shortcut key. When it opens, paste below command and hit Enter: sudo add-apt-repository ppa:otto-kesselgulasch/gimp 2.Install or Upgrade the editor. sudo apt-get update sud

Android使用init.rc触发脚本实现隐藏内置应用

[实现逻辑] 通过在property_service.c中设置标志位,在设置中实现接口改变标志位, 使用init.rc中声明的服务来侦听标志位的变化,显式启动声明的服务,执行对应的脚本,把应用后缀从apk重命名为bak,从而实现隐藏(显示逻辑相反). [实现步骤]以隐藏Google Play Store(system/priv-app/Phonesky.apk)为例: 1.首先在system/core/init/property_service.c中声明并初始化标志位,0为隐藏,1为显示,默认隐

构建用于C#应用程序的应用商店(一)

我在就职的公司开发工具型软件,桌面版的,我们公司有各种工具软件的需求.现在我已经记不清我生产了多少了.我相信再过一段时间,也许几个月,也许一年后,我也会记不住之前开发过什么,或许有一定的类别的印象,但是具体是什么,运行的样子就会像现在记不起以前开发的软件一样,都记不清了. 这些工具没有完整的统计功能,也或许只有单机的统计,但他们核心功能大多是需要联网的. 我无法得知工具用户的使用情况,无法向上级出具有关使用情况的报告,我只知道我做个这个东西,有人曾经用过,或者曾经提过bug. 我相信很多做桌面工

Android - AMS源码分析

Android核心分析之AMS App和AMS(SystemServer进程)还有zygote进程分属于三个独立的进程 App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过Socket进行IPC通信. 打开一个APP Launcher Launcher负责桌面图标的显示和控制,本质上也是一个应用程序,和我们的App一样,也是继承自Activity 以双击打开一个APP为例: 不管在哪里点击图标,都会调用 mLauncher.startActivi

Android添加快捷方式

private void addShortcutToDesktop() { Intent shortcut = new Intent("com.android.launcher.action.INSTALL_SHORTCUT"); // 不允许重建 shortcut.putExtra("duplicate", false); // 设置名字 shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME,getString(R.string