android shortcut 快捷键 相关问题记录

原创 2015年11月18日 16:19:30

快捷键的生成、删除、判断 那些方法 原生的系统一般木有问题 第三方rom 就会存在 适配问题 

一、权限:

1、manifest 文件中 添加权限 

<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>
	<uses-permission android:name="com.android.launcher.permission.UNINSTALL_SHORTCUT"/>
</pre>下面就是关于这个权限 <p></p><p></p><pre name="code" class="html">com.android.launcher.permission.READ_SETTINGS

不同版本 不同的机型 添加的不同 

Build.VERSION.SDK_INT  < 8 :

com.android.launcher.permission.READ_SETTINGS

Build.VERSION.SDK_INT  < 19 :

com.android.launcher2.permission.READ_SETTINGS
Build.VERSION.SDK_INT  >=19 :

com.android.launcher3.permission.READ_SETTINGS

以华为为例 就需要 添加

uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS"/>
否则在下面的判断的方法里会报错出现

java.lang.SecurityException: Permission Denial:
 opening provider com.huawei.android.launcher.LauncherProvider from ProcessRecord (pid=17220, uid=10150) 
 requires com.huawei.android.launcher.permission.READ_SETTINGS or com.huawei.android.launcher.permission.WRITE_SETTINGS

这里列出大部分的平牌机对应的相应权限

<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.launcher2.permission.READ_SETTINGS"/>
<uses-permission android:name="com.android.launcher2.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.android.launcher3.permission.READ_SETTINGS"/>
<uses-permission android:name="com.android.launcher3.permission.WRITE_SETTINGS"/>
<uses-permission android:name="org.adw.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="org.adw.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.htc.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.htc.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.qihoo360.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.qihoo360.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.lge.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.lge.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="net.qihoo.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="net.qihoo.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="org.adwfreak.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="org.adwfreak.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="org.adw.launcher_donut.permission.READ_SETTINGS"/>
<uses-permission android:name="org.adw.launcher_donut.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.huawei.launcher3.permission.READ_SETTINGS"/>
<uses-permission android:name="com.huawei.launcher3.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.fede.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.fede.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.sec.android.app.twlauncher.settings.READ_SETTINGS"/>
<uses-permission android:name="com.sec.android.app.twlauncher.settings.WRITE_SETTINGS"/>
<uses-permission android:name="com.anddoes.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.anddoes.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.tencent.qqlauncher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.tencent.qqlauncher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.huawei.launcher2.permission.READ_SETTINGS"/>
<uses-permission android:name="com.huawei.launcher2.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.android.mylauncher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.android.mylauncher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.ebproductions.android.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.ebproductions.android.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.oppo.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.oppo.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.lenovo.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.lenovo.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="com.huawei.android.launcher.permission.READ_SETTINGS"/>
<uses-permission android:name="com.huawei.android.launcher.permission.WRITE_SETTINGS"/>
<uses-permission android:name="telecom.mdesk.permission.READ_SETTINGS"/>
<uses-permission android:name="telecom.mdesk.permission.WRITE_SETTINGS"/>
<uses-permission android:name="dianxin.permission.ACCESS_LAUNCHER_DATA"/>


二、provider.authority为null的问题

public  boolean hasShortcut(Context context, String shortCutName)
	{
		boolean has = false;
		final ContentResolver cr = context.getContentResolver();
		String AUTHORITY = getAuthorityFromPermission(context,
				"com.android.launcher.permission.READ_SETTINGS");

		final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY
				+ "/favorites?notify=true");

		// 确认content Provider中是否有快捷键信息
		Cursor c = cr.query(CONTENT_URI, new String[]
		{ "title", "iconResource" }, "title=?", new String[]
		{ shortCutName.trim() }, null);
		if (c != null && c.getCount() > 0)
		{
			has = true;
			if (c!=null&&!c.isClosed())
			{
				c.close();
			}
		}
		return has;
	}


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;
	}

通常写法 应该是这样 或者再加入这些代码:

	if (TextUtils.isEmpty(AUTHORITY))
		{
			int sdkInt = Build.VERSION.SDK_INT;
			if (sdkInt < 8)
			{ // Android 2.1.x(API 7)以及以下的
				AUTHORITY = "com.android.launcher.settings";
			} else if (sdkInt < 19)
			{// Android 4.4以下
				AUTHORITY = "com.android.launcher2.settings";
			} else
			{// 4.4以及以上
				AUTHORITY = "com.android.launcher3.settings";
			}
		}

但对第三方rom来说 好像还是行不通  权限值虽然取到了 这样得到的uri 对应的cursor 依然为空 看来权限并没有获取 正确 。通过对provideInfo的遍历 我发现后缀字符串为"launcher.permission.READ_SETTINGS" 日志过滤出的权限只有一个 并且正是我想要的。以下是我对获取权限方法的些许改动

private  String getAuthorityFromPermission(Context context)
	{
		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)
					{
						
							//"launcher.permission.READ_SETTINGS" 规律总结 不见得适配所有 需要测试
							if (!TextUtils.isEmpty(provider.readPermission)&&provider.readPermission.contains("launcher.permission.READ_SETTINGS"))
							{
								return provider.authority;
							}
					}
				}
			}
		}

		return null;
	}

 三 、创建快捷方式  点击进入相应的程序或界面

public  void addShortCut(Context mContext)
	{
		Intent shortcut = new Intent(
				"com.android.launcher.action.INSTALL_SHORTCUT");
		shortcut.putExtra("duplicate", false);
		shortcut.putExtra(Intent.EXTRA_SHORTCUT_NAME, mContext.getResources()
				.getString(R.string.str_shortCutName));
		Parcelable shortcutIcon = Intent.ShortcutIconResource.fromContext(
				mContext, R.drawable.icon_shortcut);
		shortcut.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, shortcutIcon);

		Intent intent = new Intent();
//		ComponentName comp = new ComponentName(mContext.getPackageName(),
//				mContext.getPackageName() + ".ui.xx."
//						+ IntentTargetClass.class.getSimpleName());

		intent.setAction(Intent.ACTION_MAIN);
		intent.addCategory(Intent.CATEGORY_LAUNCHER);
		intent.setClass(mContext, IntentTargetClass.class);
//		intent.setComponent(comp);
		shortcut.putExtra(Intent.EXTRA_SHORTCUT_INTENT, intent);
		mContext.sendBroadcast(shortcut);

	}

通常都没有问题 但个别版本 个别第三方又会出现  虽然出现了创建xxx 快捷方式的提醒 但是 手机桌面并没有快捷图标的出现 

这个时候 我把不重复创建的设置  置为true 是否已有创建 需要根据 快捷方式是否已经存在进行判断

shortcut.putExtra("duplicate", true);
另外 有的快捷方式虽已出现 但是点击快捷方式 并没有进入 我们想要进入的界面 activity

在该activity的声明里 加入  intent_filter  

 <intent-filter >
                <action android:name="android.intent.action.CREATE_SHORTCUT"/>
            </intent-filter>
大部分情况下都是ok了 但时仍有个别 快捷方式 图标显示正确 但是 名称并没有显示出我们赋予的 shortcutName 而是显示 app_name 例如 LG部分机型

这个问题没有解决 希望有大神 能帮助解答 


本文 属于 只知其一不知其二 的尝试解决方式  很希望 那些看Launcher 模块源码的大神们 能分享指点一二 

如有错误 欢迎指正







Android的Laucher相关的权限(Shortcut)

很多小伙伴使用shortcut可能会遇到很多莫名的问题,这里提供一份权限声明列表供大家参考哦,希望有帮助,如果有更多的欢迎提出补充啦。kage: com.eg.android.AlipayGphone...
  • qwer4755552
  • qwer4755552
  • 2016年10月17日 09:32
  • 1915

Android Launcher开发(五)添加应用程序桌面快捷方常见问题及解决方案

最近做到的应用做刚好需要添加快捷方式的功能, 在参考了源代码和网上一些其他资料后做了出来. 在做的时候遇到两个问题, 一.  程序卸载后桌面快捷方式仍然存在:   关于此问题, 网上的资料和实际中...
  • t12x3456
  • t12x3456
  • 2012年08月12日 20:41
  • 19108

在小米、三星等系统应用图标上显示badge

大家经常看见在小米或者三星系统上,应用会把应用的消息数量想苹果手机一样显示在右上角,其实这种消息提示的方法在原生Android上是不支持的,原生的launcher在图标上没有显示徽标的view。 ...
  • u010825468
  • u010825468
  • 2015年09月22日 16:32
  • 2833

Android - 不同手机的权限异常

不同手机的权限异常本文地址:http://blog.csdn.net/caroline_wendy添加手机快捷方式和其他读写配置方面,需要添加某些定制的读写权限(READ_SETTINGS\WRITE...
  • u012515223
  • u012515223
  • 2014年11月26日 08:24
  • 3807

解决 SecurityException: Permission Denial: opening provider问题

在练习内容提供器(ContentProvider)时,遇到问题报错信息: java.lang.SecurityException: Permission Denial: opening pro...
  • qzguo2006
  • qzguo2006
  • 2015年04月01日 00:13
  • 2124

java.lang.SecurityException: Permission Denial: opening provider的解决方法

在清单文件manifest文件中对provider作如下授权:
  • hshqing
  • hshqing
  • 2016年03月16日 13:34
  • 1258

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

在两个手机上测试,发现小米手机上添加了快捷方式后不能移除,三星手机可以。权限   要在手机桌面上添加快捷方式,首先需要在manifest中添加权限。 ...
  • u011068702
  • u011068702
  • 2016年02月20日 21:33
  • 1907

C++ buider 记录shortcut 快捷键

String KeyStr=ShortCutToText(ShortCut(Msg.CharCode, KeyDataToShiftState(Msg.KeyData)));
  • cmlxiaogeaaa
  • cmlxiaogeaaa
  • 2016年05月28日 15:14
  • 92

Permission Denial: opening provider com.xxc.day4(包名).TestContentProvider from ProcessRecord

场景:android4.2 在使用到 ContentProvider 的时候遇到的问题,报错: Permission Denial: opening provider  uid=10033) .......
  • xuxiaocheng1
  • xuxiaocheng1
  • 2014年05月23日 14:40
  • 963

(报错)java.lang.SecurityException: Permission Denial: opening provider

测试调用外部提供的ContentProvider时候报错解决: 在自定义内容提供类的工程中的manifest加:...
  • maozezhong0
  • maozezhong0
  • 2016年07月26日 10:49
  • 283
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android shortcut 快捷键 相关问题记录
举报原因:
原因补充:

(最多只允许输入30个字)