【问题标题】:Android N permission IssueAndroid N 权限问题
【发布时间】:2016-12-01 04:39:42
【问题描述】:

我的测试设备上有 Android N Developer 预览版,我在应用启动期间请求运行时权限。

但不幸的是,该应用没有显示用于授予权限的警报对话框。我正在使用以下代码:

启动器活动

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        if(checkPermissions()) {
            renderView();
        }
    }

    private boolean checkPermissions() {

        int permissionWriteStorage = ContextCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE);
        int permissionPhoneState = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);

        Log.i("permission",(permissionWriteStorage == PackageManager.PERMISSION_GRANTED) + "");
        //This prints false

        List<String> listPermissionsNeeded = new ArrayList<>();
        if (permissionWriteStorage != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission_group.STORAGE);
        }
        if (permissionPhoneState != PackageManager.PERMISSION_GRANTED) {
            listPermissionsNeeded.add(Manifest.permission.READ_PHONE_STATE);
        }

        if (!listPermissionsNeeded.isEmpty()) {
            Log.i("permission", "in if");
            //I get this in the logs

            ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_ID_MULTIPLE_PERMISSIONS);
            return false;
        }
        return true;
    }
}

build.gradle

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'

android {
    compileSdkVersion 24
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId 'com.***.***'
        minSdkVersion 16
        targetSdkVersion 24
    }
}

编辑:解决方案 (1/2)

通过将构建工具版本更改为24.0.1,我收到了READ_PHONE_STATE 权限的警报,但没有收到权限组STORAGE 的警报。 需要对权限组的每个权限分别询问吗?

编辑 2:解决方案 (2/2)

我设法通过将Manifest.permission_group.STORAGE 替换为Manifest.permission.WRITE_EXTERNAL_STORAGE 来解决它。根据文档,您只需要确认整个组的一项危险权限即可。

用户只需为每个权限组授予一次权限。如果您的应用请求该组中的任何其他权限(在您的应用清单中列出),系统会自动授予它们。

【问题讨论】:

    标签: android android-permissions android-7.0-nougat


    【解决方案1】:

    我不确定但更改了构建工具版本

    android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"
    
    defaultConfig {
        applicationId 'com.***.***'
        minSdkVersion 16
        targetSdkVersion 24
    }
    

    【讨论】:

    • buildtoolsVersion 更改为24.0.1 确实帮助了我。现在我得到了READ_PHONE_STATE 的对话框,但不是权限组STORAGE
    • @Prera​​kSola,试试这个。很多时候没有得到值(LoginActivity.this,...)
    • 我能够通过将Manifest.permission_group.STORAGE 替换为Manifest.permission.WRITE_EXTERNAL_STORAGE 来解决它。
    • 感谢您的帮助。
    • 这个答案解决了我的一半问题,问题中提到了另一半解决方案作为编辑。
    【解决方案2】:

    用户 ActivityCompat 而不是 ContextCompat

    int permissionWriteStorage = ActivityCompat.checkSelfPermission(this, Manifest.permission_group.STORAGE);
    int permissionPhoneState = ActivityCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE);
    

    【讨论】:

    • 我认为这不是问题,因为使用ContextCompat 我得到了正确的权限值。我在第一次启动时收到false,这是正确的。
    • 检查 listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()] 是否正确返回 String[]。先尝试一个权限
    【解决方案3】:

    我知道这种技术很麻烦,但为什么不直接使用它呢?

    您也可以实现多个权限。

    void getPermission(){
        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission_group.STORAGE) != PackageManager.PERMISSION_GRANTED) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
                ActivityCompat.requestPermissions(Final_maps.this,
                        new String[]{android.Manifest.permission_group.STORAGE, android.Manifest.permission.READ_PHONE_STATE},
                        CODE);
    
        }
    
    }
    
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case CODE:
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    setLocationEnabled();
                    Toast.makeText(this, "Permission Granted!", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(this, "Permission Denied!", Toast.LENGTH_SHORT).show();
                    finish();
                }
        }
    }
    

    【讨论】:

      【解决方案4】:

      如果不实现 onRequestPermissionsResult 方法,权限提示将不会显示。

      【讨论】:

      • 我已经实现了。
      【解决方案5】:

      在清单中授予权限

      <uses-permission android:name="android.permission.INTERNET"/>
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      

      然后将代码粘贴到 Activity 中

       private void getPermission() {
      
          if (ContextCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) !=
                  PackageManager.PERMISSION_GRANTED) {
              if (ContextCompat.checkSelfPermission(MapsActivity.this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
                      PackageManager.PERMISSION_GRANTED) {
      
                  ActivityCompat.requestPermissions(MapsActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION}, 0);
              }
          }
      }
      

      也调用这个覆盖方法

       @Override
      public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
          if (requestCode == PERMISSION_REQUEST_CODE) {
              if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED
                      && grantResults[1] == PackageManager.PERMISSION_GRANTED) {
      
      
              }
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-16
        • 1970-01-01
        • 2011-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多