关于Android添加、判断快捷方式是否已添加的问题
2014-03-08 15:36
726 查看
首先向像我一样的Mono for Android程序员致敬,因为我晓得Mono开发Android的无限的蛋疼!致敬!
最近在为Android项目app添加快捷方式,情景是这样的,为了争取同行业的竞争力,我们打算让app在第一次运行时添加快捷方式到桌面上,之后每隔n天后就检查桌面上是否存在快捷方式,否则就添加。
这一过程听起来很好实现,但是说与做之间还是有一段距离的,添加还没什么问题,在AndroidMainFest文件里添加“com.android.launcher.permission.INSTALL_SHORTCUT”权限后,使用系统广播可以轻松来实现添加快捷方式。但是在我判断桌面上是否已经存在的时候就出现麻烦了,输出窗口里打印了这么一句话“Failed to find provider info for com.android.launcher.settings”。之后我在网上查找了原因后,发现可能和sdk版本之间有一定关系,简单的说就是创建和删除快捷方式的receiver没什么变化但是查询的provider有了变化,网上有这么一个方法:
public bool hasShortCut(Context context)
{
string url = "";
if (getSystemVersion() < 8)
{
url = "content://com.android.launcher.settings/favorites?notify=true";
}
else
{
url = "content://com.android.launcher2.settings/favorites?notify=true";
}
ContentResolver resolver = context.ContentResolver;
ICursor cursor = resolver.Query(Android.Net.Uri.Parse(url), null, "title=?", new string[] { appName }, null);
if (cursor != null && cursor.MoveToFirst())
{
cursor.Close();
return true;
}
return false;
}
private int getSystemVersion()
{
return Convert.ToInt32(Android.OS.Build.VERSION.SdkInt.ToString());
}
但是还是没有实现效果,现在又输出了“Failed to find provider info for com.android.launcher.settings” 的错误,这次我直接跑去stackoverflow 查找 http://stackoverflow.com/questions/8501306/android-shortcut-access-launcher-db(这是stackoverflow网站上的解释),我就直接拿来用:
string getAuthorityFromPermission(string permission)
{
if (permission == null) return null;
IList<PackageInfo> packs = context.PackageManager.GetInstalledPackages(PackageInfoFlags.Providers);
if (packs != null)
{
foreach (PackageInfo pack in packs)
{
IList<ProviderInfo> providers = pack.Providers;
if (providers != null)
{
foreach (ProviderInfo provider in providers)
{
if (permission.Equals(provider.ReadPermission))
return provider.Authority;
if (permission.Equals(provider.WritePermission))
return provider.Authority;
}
}
}
}
return null;
}
但是这次我执行getAuthorityFromPermission(“com.android.launcher2.permission.READ_SETTINGS”)方法返回的值却是null,很是不解,最后我在它遍历的时候打印出所有的值,查看结果后,我发现了点东西:(看图)
因为我的手机是Htc的,由原来的com.android.launcher.permission.READ_SETTINGS,变成了现在看到的com.htc.launcher.permission.READ_SETTINGS,于是我就把参数修改下,变成了getAuthorityFromPermission(“com.htc.launcher2.permission.READ_SETTINGS”),几经周折下图是最后的代码:
这时候我满心欢喜的开始调试,结果,又报错。。。报错的原因说是权限安全问题,我这时突然想起来,那个AndroidMainfest文件也应该要修改了,对要修改成这样:
到此为止总算是大功告成了,对于android设备的厂商定制我是感到很是无奈啊,这是htc的,如果是联想的,金立的等等其他厂商,难道我要写不同版本的AndroidMainfest吗?这个很明显是不明智的。但是在Android上层应用开发的技术层面上来讲,应该是不可能在代码里动态添加权限的。但是网上有人提供了权限列表,我们可以拿来用下,把下面那些不同的厂商的权限都写进去,然后再代码里匹配包含“permission.READ_SETTINGS”的,然后得到的值就是Authority变量,目前我也只能这样做,你们有什么好的方法,请多多指教!
执行:getAuthorityFromPermission(“permission.READ_SETTINGS”)
string getAuthorityFromPermission(string permission)
{
if (permission == null) return null;
IList<PackageInfo> packs = context.PackageManager.GetInstalledPackages(PackageInfoFlags.Providers);
if (packs != null)
{
foreach (PackageInfo pack in packs)
{
IList<ProviderInfo> providers = pack.Providers;
if (providers != null)
{
foreach (ProviderInfo provider in providers)
{
Console.WriteLine("\r\n【" + provider.ReadPermission + "】\r\n");
if (provider.ReadPermission.Contains(permission))
return provider.Authority;
}
}
}
}
return null;
}
最近在为Android项目app添加快捷方式,情景是这样的,为了争取同行业的竞争力,我们打算让app在第一次运行时添加快捷方式到桌面上,之后每隔n天后就检查桌面上是否存在快捷方式,否则就添加。
这一过程听起来很好实现,但是说与做之间还是有一段距离的,添加还没什么问题,在AndroidMainFest文件里添加“com.android.launcher.permission.INSTALL_SHORTCUT”权限后,使用系统广播可以轻松来实现添加快捷方式。但是在我判断桌面上是否已经存在的时候就出现麻烦了,输出窗口里打印了这么一句话“Failed to find provider info for com.android.launcher.settings”。之后我在网上查找了原因后,发现可能和sdk版本之间有一定关系,简单的说就是创建和删除快捷方式的receiver没什么变化但是查询的provider有了变化,网上有这么一个方法:
public bool hasShortCut(Context context)
{
string url = "";
if (getSystemVersion() < 8)
{
url = "content://com.android.launcher.settings/favorites?notify=true";
}
else
{
url = "content://com.android.launcher2.settings/favorites?notify=true";
}
ContentResolver resolver = context.ContentResolver;
ICursor cursor = resolver.Query(Android.Net.Uri.Parse(url), null, "title=?", new string[] { appName }, null);
if (cursor != null && cursor.MoveToFirst())
{
cursor.Close();
return true;
}
return false;
}
private int getSystemVersion()
{
return Convert.ToInt32(Android.OS.Build.VERSION.SdkInt.ToString());
}
但是还是没有实现效果,现在又输出了“Failed to find provider info for com.android.launcher.settings” 的错误,这次我直接跑去stackoverflow 查找 http://stackoverflow.com/questions/8501306/android-shortcut-access-launcher-db(这是stackoverflow网站上的解释),我就直接拿来用:
string getAuthorityFromPermission(string permission)
{
if (permission == null) return null;
IList<PackageInfo> packs = context.PackageManager.GetInstalledPackages(PackageInfoFlags.Providers);
if (packs != null)
{
foreach (PackageInfo pack in packs)
{
IList<ProviderInfo> providers = pack.Providers;
if (providers != null)
{
foreach (ProviderInfo provider in providers)
{
if (permission.Equals(provider.ReadPermission))
return provider.Authority;
if (permission.Equals(provider.WritePermission))
return provider.Authority;
}
}
}
}
return null;
}
但是这次我执行getAuthorityFromPermission(“com.android.launcher2.permission.READ_SETTINGS”)方法返回的值却是null,很是不解,最后我在它遍历的时候打印出所有的值,查看结果后,我发现了点东西:(看图)
因为我的手机是Htc的,由原来的com.android.launcher.permission.READ_SETTINGS,变成了现在看到的com.htc.launcher.permission.READ_SETTINGS,于是我就把参数修改下,变成了getAuthorityFromPermission(“com.htc.launcher2.permission.READ_SETTINGS”),几经周折下图是最后的代码:
这时候我满心欢喜的开始调试,结果,又报错。。。报错的原因说是权限安全问题,我这时突然想起来,那个AndroidMainfest文件也应该要修改了,对要修改成这样:
到此为止总算是大功告成了,对于android设备的厂商定制我是感到很是无奈啊,这是htc的,如果是联想的,金立的等等其他厂商,难道我要写不同版本的AndroidMainfest吗?这个很明显是不明智的。但是在Android上层应用开发的技术层面上来讲,应该是不可能在代码里动态添加权限的。但是网上有人提供了权限列表,我们可以拿来用下,把下面那些不同的厂商的权限都写进去,然后再代码里匹配包含“permission.READ_SETTINGS”的,然后得到的值就是Authority变量,目前我也只能这样做,你们有什么好的方法,请多多指教!
执行:getAuthorityFromPermission(“permission.READ_SETTINGS”)
string getAuthorityFromPermission(string permission)
{
if (permission == null) return null;
IList<PackageInfo> packs = context.PackageManager.GetInstalledPackages(PackageInfoFlags.Providers);
if (packs != null)
{
foreach (PackageInfo pack in packs)
{
IList<ProviderInfo> providers = pack.Providers;
if (providers != null)
{
foreach (ProviderInfo provider in providers)
{
Console.WriteLine("\r\n【" + provider.ReadPermission + "】\r\n");
if (provider.ReadPermission.Contains(permission))
return provider.Authority;
}
}
}
}
return null;
}
android.permission.WRITE_EXTERNAL_STORAGE | 写入外部存储 允许程序写入外部存储,如SD卡上写文件 |
android.permission.CALL_PHONE | 拨打电话 允许程序从非系统拨号器里输入电话号码 |
android.permission.CALL_PRIVILEGED | 通话权限 允许程序拨打电话,替换系统的拨号器界面 |
android.permission.EXPAND_STATUS_BAR | 状态栏控制 允许程序扩展或收缩状态栏 |
android.permission.GET_TASKS | 获取任务信息 允许程序获取当前或最近运行的应用 |
android.permission.READ_CONTACTS | 读取联系人 允许应用访问联系人通讯录信息 |
android.permission.SET_WALLPAPER | 设置桌面壁纸 设置桌面壁纸 |
android.permission.SET_WALLPAPER_HINTS | 设置壁纸建议 设置壁纸建议 |
android.permission.VIBRATE | 使用振动 允许振动 |
android.permission.WRITE_SETTINGS | 读写系统设置 允许读写系统设置项 |
android.permission.BIND_APPWIDGET | 绑定小插件 允许一个程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限 |
android.permission.INTERNET | 访问网络 访问网络连接,可能产生GPRS流量 |
android.permission.ACCESS_NETWORK_STATE | 获取网络状态 获取网络信息状态,如当前的网络连接是否有效 |
android.permission.WRITE_EXTERNAL_STORAGE | 写入外部存储 允许程序写入外部存储,如SD卡上写文件 |
android.permission.WRITE_SECURE_SETTINGS | 读写系统敏感设置 允许程序读写系统安全敏感的设置项 |
android.permission.ACCESS_WIFI_STATE | 获取WiFi状态 获取当前WiFi接入的状态以及WLAN热点的信息 |
android.permission.CHANGE_WIFI_STATE | 改变WiFi状态 改变WiFi状态 |
android.permission.MODIFY_PHONE_STATE | 修改电话状态 修改电话状态,如飞行模式,但不包含替换系统拨号器界面 |
android.permission.CHANGE_NETWORK_STATE | 改变网络状态 改变网络状态如是否能联网 |
android.permission.READ_SYNC_SETTINGS | 读取同步设置 读取同步设置,读取Google在线同步设置 |
android.permission.WRITE_SYNC_SETTINGS | 写入同步设置 写入Google在线同步设置 |
android.permission.BLUETOOTH | 使用蓝牙 允许程序连接配对过的蓝牙设备 |
android.permission.BLUETOOTH_ADMIN | 蓝牙管理 允许程序进行发现和配对新的蓝牙设备 |
android.permission.WAKE_LOCK | 唤醒锁定 允许程序在手机屏幕关闭后后台进程仍然运行 |
android.permission.DEVICE_POWER | 电源管理 允许访问底层电源管理 |
android.permission.RESTART_PACKAGES | 结束系统任务 结束任务通过restartPackage(String)方法(该方式将在未来放弃) |
android.permission.KILL_BACKGROUND_PROCESSES | 结束后台进程 允许程序调用killBackgroundProcesses(String).方法结束后台进程 |
android.permission.READ_PHONE_STATE | 读取电话状态 访问电话状态 |
android.permission.SYSTEM_ALERT_WINDOW | 显示系统窗口 显示系统窗口 |
android.permission.ACCESS_FINE_LOCATION | 获取精确位置 通过GPS芯片接收卫星的定位信息,定位精度达10米以内 |
android.permission.ACCESS_COARSE_LOCATION | 获取粗略位置 通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米 |
android.permission.READ_EXTERNAL_STORAGE | |
com.anddoes.launcher.permission.READ_SETTINGS | |
com.anddoes.launcher.permission.WRITE_SETTINGS | |
com.android.launcher.permission.READ_SETTINGS | |
com.android.launcher.permission.WRITE_SETTINGS | |
com.teslacoilsw.launcher.permission.READ_SETTINGS | |
com.teslacoilsw.launcher.permission.WRITE_SETTINGS | |
org.adw.launcher.permission.READ_SETTINGS | |
org.adw.launcher.permission.WRITE_SETTINGS | |
com.fede.launcher.permission.READ_SETTINGS | |
com.fede.launcher.permission.WRITE_SETTINGS | |
com.google.android.gm.permission.READ_CONTENT_PROVIDER | |
com.doodleapp.launcher.permission.READ_SETTINGS | |
com.doodleapp.launcher.permission.WRITE_SETTINGS | |
com.htc.launcher.permission.READ_SETTINGS | |
com.htc.launcher.permission.WRITE_SETTINGS | |
com.gtp.nextlauncher.permission.READ_SETTINGS | |
com.gtp.nextlauncher.permission.WRITE_SETTINGS | |
com.neomtel.mxhome.permission.READ_SETTINGS | |
com.neomtel.mxhome.permission.WRITE_SETTINGS | |
com.miui.mihome2.permission.READ_SETTINGS | |
com.miui.mihome2.permission.WRITE_SETTINGS | |
com.lge.launcher.permission.READ_SETTINGS | |
com.lge.launcher.permission.WRITE_SETTINGS | |
com.sec.android.app.launcher.permission.READ_SETTINGS | |
com.sec.android.app.launcher.permission.WRITE_SETTINGS |
相关文章推荐
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- Android 关于快捷方式的总结(创建、删除、判断是否存在和跳转)
- android桌面添加快捷方式之判断是否存在无效
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- [转] Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- android桌面添加快捷方式之判断是否存在无效
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- Android应用程序快捷方式操作(添加,删除,判断是否存在)
- Android应用添加(创建)和删除及判断是否存在桌面快捷方式
- Android添加(创建)、删除及判断是否存在桌面快捷方式的方法
- 关于android创建快捷方式会启动两个应用的问题
- android 判断桌面快捷方式是否存在
- 关于android创建快捷方式会启动两个应用的问题(一)
- Android 判断桌面是否快捷方式,不存在则创建
- Android创建快捷方式和判断是否已经创建
- 【Android】判断快捷方式是否存在——兼容性更强(速度提升12倍)
- ANDROID 桌面快捷方式创建,和判断 返回false问题