关于Android添加、判断快捷方式是否已添加的问题
来源:互联网 发布:百度贴吧论坛 源码 编辑:程序博客网 时间:2024/06/06 00:43
首先向像我一样的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.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快捷方式的创建与shortcut是否已创建的判断
- 关于Vue中v-show中添加表达式用于判断是否显示的问题
- android桌面添加快捷方式
- Android添加桌面快捷方式
- android添加删除快捷方式
- Redis C客户端Hiredis的安装
- Java那些不为人知的特殊方法
- Smurf攻击
- [Debug]内存问题的一些调试方法
- something 待整理
- 关于Android添加、判断快捷方式是否已添加的问题
- CKEditor上传插件
- sigsuspend函数和sigwait函数
- 为什么Android的定位数据对谷歌来说这么重要?
- js重定向几种方法
- eclipse 生成 javadoc
- C# 怎么检测string字符串中有哪些数字?
- Eclipse中如何生成javadoc帮助文档
- Eclipse启动时fail to create Java Virtual Machine问题的解决