【问题标题】:Android request permission doesn't workAndroid请求权限不起作用
【发布时间】:2017-05-07 05:37:08
【问题描述】:

我的问题是以下权限的请求权限窗口未显示。但是如果我更改了请求的权限

static final String[] PERMISSIONS = new String[]{
    Manifest.permission.PROCESS_OUTGOING_CALLS,
    Manifest.permission.CALL_PHONE
};

static final String[] PERMISSIONS = new String[]{
    Manifest.permission.READ_EXTERNAL_STORAGE
};

它有效,我不知道为什么。所以对话框显示READ_EXTERNAL_STORAGE,但不显示PROCESS_OUTGOING_CALLSCALL_PHONE。我的代码错了吗?

清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.administrator.myapplication">
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
                 <category android:name="android.intent.category.LAUNCHER" />
             </intent-filter>
        </activity>
    </application>
</manifest>


活动:

import android.Manifest;
import android.os.Build;
import android.os.Bundle;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import static android.content.pm.PackageManager.PERMISSION_DENIED;
import static android.support.v4.content.PermissionChecker.PERMISSION_GRANTED;

public class MainActivity extends AppCompatActivity {
    protected static final int PERMISSION_REQUEST_CODE = 11186;
    static final String[] PERMISSIONS = new String[]{
        Manifest.permission.PROCESS_OUTGOING_CALLS,
        Manifest.permission.CALL_PHONE
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        checkPermission(PERMISSIONS);
    }
    protected void checkPermission(String... permissions) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            String[] requestPermissions = getRequestPermissions(permissions);
            if (requestPermissions.length > 0)
                requestPermissions(requestPermissions, PERMISSION_REQUEST_CODE);
        } else {
            int[] grantResults = new int[permissions.length];
            Arrays.fill(grantResults, PERMISSION_GRANTED);
            onRequestPermissionsResult(PERMISSION_REQUEST_CODE, permissions, grantResults);
        }
    }


    @RequiresApi(api = Build.VERSION_CODES.M)
    private String[] getRequestPermissions(String[] permissions) {
        List<String> list = new ArrayList<>();
        for (String permission : permissions) {
            if (checkSelfPermission(permission) == PERMISSION_DENIED) {
                list.add(permission);
            }
        }
        return list.toArray(new String[list.size()]);
    }
}

build.gradle:

  android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"
    defaultConfig {
        applicationId "com.example.administrator.myapplication"
        minSdkVersion 17
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    testCompile 'junit:junit:4.12'
}

感谢您的帮助!

【问题讨论】:

    标签: android android-permissions


    【解决方案1】:

    请在 build.gradle 文件中检查您的 minSdk 版本,并确保您的 APK 部署在 22 (M) 以上的 SDK(mobile) 版本中。

    【讨论】:

    • minSdkVersion 17 targetSdkVersion 25 错了吗?
    • 没有错,请检查您的手机版本是否为M或更高版本,如果您想手动测试,请转到设置->应用程序->选择您的应用程序->您将获得关闭权限的选项手动。然后你可以检查它。希望它会有所帮助。否则复制您的活动
    • 我的手机是android 7.0。我也检查了设置。我的应用程序没有call_photo权限,但它没有显示请求窗口弹出,当我调试时,代码可以运行到“ requestPermissions(requestPermissions, PERMISSION_REQUEST_CODE);"这一行,但没有显示 TnT
    • 但我在android7.0设备上运行
    【解决方案2】:

    与 min sdk 无关。 Target Sdk 必须为 23 或更高才能请求权限,并且运行时权限对话框可用于 23 或更高的设备。如果您在低于 23 的设备上尝试您的代码,您将无法看到权限对话框,就像在后台接受这些权限一样。

    另一个问题是权限有两种类型的权限:

    普通权限和危险权限。

    只能在运行时询问危险的权限。但它应该适用于 Manifest.permission.PROCESS_OUTGOING_CALLS、Manifest.permission.CALL_PHONE,因为它们属于危险权限组。 You can check dangerous and normal permissions.

    【讨论】:

    • 谢谢,但是问题还是解决不了,为什么 Manifest.permission.READ_EXTERNAL_STORAGE 工作,Manifest.permission.PROCESS_OUTGOING_CALLS,Manifest.permission.CALL_PHONE 不工作,也属于危险
    • 我实际上从未尝试过这两个权限,但我认为问题可能与代码有关。询问多个权限可能有问题。你能用位置或相机等其他权限检查它吗?
    • 我已经尝试了一些。不要工作:SEND_SMS,位置,GET_ACCOUNTS 工作:camera,READ_CALENDAR
    • 使用this utility class逐个请求权限,或一次请求多个权限。根据您的需要修改位置,相机等,它会很好,您的 MainActivity 会更干净。
    • 我认为你的问题是ActivityCompat.requestPermissions(activity, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_PERMISSION_MULTIPLE)
    【解决方案3】:

    我遇到了同样的问题。也许有人会有用。您需要添加到 Manifest:

    <uses-feature android:name="android.hardware.telephony" android:required="false"/>
    

    【讨论】:

      猜你喜欢
      • 2017-07-17
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 2019-09-03
      • 1970-01-01
      • 2015-08-04
      • 2017-11-07
      • 1970-01-01
      相关资源
      最近更新 更多