读取email数据库的权限问题

来源:互联网 发布:淘宝账号从哪里能买到 编辑:程序博客网 时间:2024/05/20 18:50
在自己的应用中使用email的uri来查询数据,结果提示需要ACCESS_PROVIDER的权限,添加后运行依然提示此错误,实在找不到原因了,访问通话记录与短信时添加完权限后都无此问题。
代码如下:
Cursor cur = mContext.getContentResolver().query(
Uri.parse("content://com.android.email.provider/message"),
null,
null,
null,
null);

报错没有的权限是<uses-permission android:name="com.android.email.permission.ACCESS_PROVIDER" />,但确实是添了的。

解决办法:


导致错误的原因如下:
因为Android本身自带的email应用的保护级别很高,是android:protectionLevel="signatureOrSystem",从android sdk自带文档了解到此种权限保护级别需要system本身镜像应用或者是同system镜像具有相同的签名应用才可以访问,因此一般的第三方应用即使添加了permission也还是会报错的。

解决方法:(生成system.img)
1 将自己的应用方到android源代码的packages/apps/目录下,添加Android.mk文件
2 在应用程序的AndroidManifest.xml中的manifest节点中加入android:sharedUserId="android.uid.system"这个属性。
3 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform这一行
4 使用mm命令来编译,生成的apk就有同system一样的权限了。
5 在android根目录下用make snod重新生成system.img
6 启动emulator运行下应用看看是否好了。
由于我这里的email数据库没有任何信息,我只好打出来columns来看,和我期望读取的一样。

网上还有另外一种方法,但我用signapk报错了所以也就不介绍了,等解决好了再继续介绍。
困扰了好久的问题终于解决了希望能对大家都有帮助。

permission可分四个等级

android:protectionLevel="normal"
android:protectionLevel="dangerous"
android:protectionLevel="signature"
android:protectionLevel="signatureOrSystem"


根据SDK的文档和查的资料来讲signatureOrSystem这种权限的应用第三方的应用时无法单独访问的,要么把自己的应用一同生成system.img,要么就得和system.img具有一样的签名。像我这个若单独做个应用的话那么肯定是实现不了的,因为每款机器签名肯定都不一样,解决的办法就是把软件集成到手机厂商的img里面。因此你说的放到真机里面肯定不行的,它不能作为一款第三方软件发布,若将已经集成的img文件重新烧一下手机的话我想应该是可以的了。

原创粉丝点击