Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android,在代码中查找所有位置以请求权限_Java_Android_Android Permissions - Fatal编程技术网

Java Android,在代码中查找所有位置以请求权限

Java Android,在代码中查找所有位置以请求权限,java,android,android-permissions,Java,Android,Android Permissions,我正在做一个棉花糖前设备的应用程序。源代码不是我写的,项目本身也相当大。 我目前正在制作应用程序,以便在需要时请求权限 问题是:如何在代码中找到应该请求权限的所有位置? 我正在使用Android Studio 编辑 有些人建议将api改为23,然后运行应用程序,看看它崩溃的地方。 问题是,应用程序并不是在每个地方都崩溃 例如,未经许可运行此代码将使应用程序崩溃: TelephonyManager manager = (TelephonyManager) context .

我正在做一个棉花糖前设备的应用程序。源代码不是我写的,项目本身也相当大。 我目前正在制作应用程序,以便在需要时请求权限

问题是:如何在代码中找到应该请求权限的所有位置? 我正在使用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没有显示这些位置。我不确定它是否应该是。

当然,编译目标api 23,不要添加权限代码,运行应用程序,看看它在哪里崩溃

一旦你开始精确定位位置,然后打开权限(通过应用程序设置),这样你就可以通过该屏幕,然后将其关闭,这样你就可以查看它是否崩溃


Logcat在让您知道权限被拒绝方面非常具有描述性…

根据开发者页面关于:

但是,在几乎所有情况下,权限失败都会打印到系统日志中

因此,运行应用程序并在日志中搜索“权限”或类似内容


使用单元测试来确保覆盖代码中可能需要权限的所有位置。

您可以使用以下技巧:从清单中删除危险的权限。这样,您可以在几乎任何设备上进行测试,您将确保它将崩溃,并且您将找到需要这些权限的确切位置。我就是这样做的。

添加

lintOptions {
    enable 'MissingPermission'
}

在您的
build.gradle
中。这将在您构建应用程序后显示警告。

在第一次启动应用程序时请求所需的所有权限


这不是一个最佳实践,而是这个问题的答案

这是不可能抽象地回答的。您必须从UI请求权限。因此,您需要确定您在应用程序中使用安全API的位置,然后确定这是您应该事先请求的权限(例如,在应用程序第一次运行时),还是仅当用户点击某些UI元素(例如,操作栏项)请求使用需要安全API的代码时才请求。@commonware,我要求提供一种简单的方法,在您不熟悉项目时确定这些位置。我知道之后该怎么做。也许你可以根据sdk 23编译。您可以在android studio中运行inspection。@blay,它只是不显示这些位置,而显示其他错误和警告。是的,忘了提到我已经尝试过了。看我的编辑。耶,我看到你写了“问题是应用程序并不是在每个地方都崩溃。”但是如果你看一下logcat,你会看到权限被拒绝。我建议通过错误日志进行过滤,并在使用appBtw时观察,我也必须在一个项目中这样做。这就是我解决这个问题的方法,非常繁琐而且容易出错——你怎么知道你测试了应用程序中的所有地方,需要许可?需要一个全面的工具。如果用户运行的是Android 6.0(API级别23)或更高版本,请不要让用户不知所措,用户必须在运行应用程序时授予您的应用程序权限。如果您同时向用户提出大量权限请求,您可能会压倒用户并导致他们退出您的应用程序。相反,您应该在需要时请求权限。虽然没有一个答案对我有完全的帮助,但这是最好的答案。这真的显示了你所有缺失的权限吗?这对我没有任何帮助。