我正在开发一个Marshmallow设备的应用程序。源代码不是由我编写的,项目本身也很大。 我目前正在让应用程序在需要时请求权限。
问题是:如何在代码中找到应该请求权限的所有地方? 我正在使用Android Studio。
修改
有些人建议将api更改为23并运行应用程序并查看崩溃的位置。
问题是应用程序不会在每个地方崩溃。
例如,在没有权限的情况下运行此代码会导致应用程序崩溃:
TelephonyManager manager = (TelephonyManager) context
.getSystemService(Context.TELEPHONY_SERVICE);
虽然这个只返回一个空数组,而不是崩溃。
final String[] SELF_PROJECTION = new String[]{
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,};
Cursor cursor = context.getContentResolver()
.query(ContactsContract.Profile.CONTENT_URI, SELF_PROJECTION, null, null, null);
此外,Android Lint不显示这些地方。我不确定是否应该这样。
答案 0 :(得分:5)
根据有关security permissions的开发者页面:
但是,几乎在所有情况下,都会在系统日志中打印权限失败。
所以运行应用程序并在日志中搜索"权限"或类似的。
使用单元测试来确保覆盖代码中可能需要权限的所有位置。
答案 1 :(得分:2)
添加
lintOptions {
enable 'MissingPermission'
}
在build.gradle
中。这将在您构建应用程序后显示警告。
答案 2 :(得分:1)
当然,编译目标api 23,不要添加权限代码,运行应用程序并查看它崩溃的位置。
一旦你开始精确定位位置,然后打开权限(通过应用程序设置),这样你就可以通过那个屏幕,然后关闭它们,这样你就可以看到它是否崩溃。
Logcat非常具有描述性,让您知道权限被拒绝...
答案 3 :(得分:0)
您可以这样做:从清单中删除危险权限。通过这种方式,您可以在几乎任何设备上进行测试,确定它会崩溃,并且您将找到需要这些权限的确切位置。无论如何,我就是这样做的。
答案 4 :(得分:-4)
首次启动应用时请求所需的所有权限。
它不是最佳做法,但它是此问题的回答。