【问题标题】:Ask multiples permissions android 6.0询问多个权限 android 6.0
【发布时间】:2018-04-23 23:27:37
【问题描述】:

我必须显示多个权限,我的程序只显示第一个我不知道为什么,我希望你能帮助我

进口

import static android.Manifest.permission.CHANGE_CONFIGURATION;
import static android.Manifest.permission.MODIFY_AUDIO_SETTINGS;
import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; 
import static android.Manifest.permission.WRITE_SETTINGS;

主要

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    Permis();
}

功能权限

private void Permis() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if ((checkSelfPermission(WRITE_EXTERNAL_STORAGE) ==  PackageManager.PERMISSION_GRANTED) &&
            (checkSelfPermission(CHANGE_CONFIGURATION) ==  PackageManager.PERMISSION_GRANTED) &&
            (checkSelfPermission(MODIFY_AUDIO_SETTINGS) ==  PackageManager.PERMISSION_GRANTED) &&
            (checkSelfPermission(WRITE_SETTINGS) ==  PackageManager.PERMISSION_GRANTED)) {

            Toast.makeText(tuneActivity.this, "Permiso concedido  anteriormente", Toast.LENGTH_SHORT).show();
        }

        if ((shouldShowRequestPermissionRationale(WRITE_EXTERNAL_STORAGE))||
            (shouldShowRequestPermissionRationale(CHANGE_CONFIGURATION)) || 
            (shouldShowRequestPermissionRationale(MODIFY_AUDIO_SETTINGS)) || 
            (shouldShowRequestPermissionRationale(WRITE_SETTINGS))) {

            DialogoAlerta();

        } else {
            requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE,  CHANGE_CONFIGURATION, MODIFY_AUDIO_SETTINGS, WRITE_SETTINGS},
                        MY_PERMISSIONS_REQUEST);
        }
    }
}

功能对话框提示

private void DialogoAlerta() {

        AlertDialog.Builder dialogo=new AlertDialog.Builder(tuneActivity.this);
        dialogo.setTitle("Permisos desactivados");
        dialogo.setMessage("Debe aceptar los permisos para poder definir un  tono como ringtone o sonido de notificacion");
        dialogo.setPositiveButton("Aceptar", new  DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface dialogInterface, int i) {

                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    requestPermissions(new String[]{WRITE_EXTERNAL_STORAGE,  CHANGE_CONFIGURATION, MODIFY_AUDIO_SETTINGS, WRITE_SETTINGS},
                            MY_PERMISSIONS_REQUEST);
                }
            }

        });
    }

onRequestPermissionsResult

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
            super.onRequestPermissionsResult(requestCode,permissions,grantResults);
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST: {
                // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0 && grantResults[0] ==
                 PackageManager.PERMISSION_GRANTED && grantResults[1] ==
                 PackageManager.PERMISSION_GRANTED && grantResults[2] ==
                 PackageManager.PERMISSION_GRANTED && grantResults[3] ==
                 PackageManager.PERMISSION_GRANTED ) { 
                    Toast.makeText (tuneActivity.this,"Permiso concedido",Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText (tuneActivity.this,"Permiso no concedido",Toast.LENGTH_SHORT).show();
            }
        return;
    }
}

}

所以.. 程序只是要求第一个权限'Write External Storage' 然后它显示'permiso no concedido' 但我不知道为什么,我希望你能解释我为什么,谢谢,对不起我的英语不好

【问题讨论】:

    标签: java android android-studio permissions android-permissions


    【解决方案1】:

    只有保护级别为dangerous的权限才需要权限请求。您可以参考此document 来确定保护级别。请参阅此permission overview document 了解更多详情。

    MODIFY_AUDIO_SETTINGS

    您看不到此权限请求,因为此权限的保护级别为normal。此权限将自动授予,无需向用户请求。

    WRITE_SETTINGS

    您看不到权限请求,因为保护级别为 signature。基于documentation

    注意:如果应用面向 API 级别 23 或更高级别,应用用户必须通过权限管理屏幕明确授予应用此权限。 应用通过发送带有动作 ACTION_MANAGE_WRITE_SETTINGS 的意图来请求用户的批准。应用可以通过调用 Settings.System.canWrite() 来检查它是否具有此授权。

    您需要触发 Intent 才能请求此权限。

    CHANGE_CONFIGURATION

    此权限要求应用通过固件签名密钥签名或安装在系统分区上。因此,您不能通过权限对话框请求此权限。参考这个SO

    但是有一种解决方法可以通过adb 授予此权限,如下所示:

    adb -d shell pm grant <your package name> android.permission.CHANGE_CONFIGURATION

    但您不能期望所有用户都具备执行此操作的技术知识。

    【讨论】:

      【解决方案2】:

      就像@Sagar 所说,我必须请求的唯一权限是“WRITE_EXTERNAL_STORAGE”,因为“MODIFY_AUDIO_SETTINGS”只是被认为是 android 的“正常”。但回到我的问题,我发现的一个解决方案是:

      “WRITE_EXTERNAL_STORAGE”只是像我一样询问它,为了获得 WRITE_SETTINGS 我做了那个代码:

      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
              retVal = Settings.System.canWrite(this);
      if(retVal){  
                  Toast.makeText(this, "All good", Toast.LENGTH_LONG).show();
              }else{
                  Intent intent = new Intent(android.provider.Settings.ACTION_MANAGE_WRITE_SETTINGS);
                              startActivity(intent); // we open the part of the system configuration in which the person have to just enable our app ;)
              }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-11-22
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多