【问题标题】:获取 W/Activity:一次只能请求一组权限
【发布时间】:2017-06-21 11:22:32
【问题描述】:

我制作了一个请求相机和 GPS 的应用程序,但是当我执行时,我多次收到此警告,间隔不到 1 秒。

W/Activity:一次只能请求一组权限)

谁能告诉我为什么?

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent = getIntent();
    mStatusCamera = intent.getStringExtra("camera");
    mScannerView = new ZXingScannerView(this) {

        @Override
        protected IViewFinder createViewFinderView(Context context) {
            return new CustomZXingScannerView(context);
        }

    };
    List<BarcodeFormat> formats = new ArrayList<>();
    mListaPassageiros = new ArrayList<>();
    formats.add(BarcodeFormat.QR_CODE);
    setContentView(mScannerView);
    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion >= android.os.Build.VERSION_CODES.M) {
        if (!checkPermission()) {
            requestPermission();
        } else {
            executarDepoisDaPermissao();
        }
    }
}
private boolean checkPermission() {
    return (ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA) == PackageManager.PERMISSION_GRANTED
    && ContextCompat.checkSelfPermission(getApplicationContext(), ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED
    && ContextCompat.checkSelfPermission(getApplicationContext(), ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED);
}

public void executarDepoisDaPermissao() {
    final BancoController crud = new BancoController(getBaseContext());
    mConectado = isNetworkAvailable();
}

根据要求添加了 RequestPermissio。

 private void requestPermission() {
    int currentapiVersion = android.os.Build.VERSION.SDK_INT;
    if (currentapiVersion >= android.os.Build.VERSION_CODES.M) {
        if (!checkPermission()) {
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA,
                    Manifest.permission.ACCESS_FINE_LOCATION,
                    Manifest.permission.ACCESS_COARSE_LOCATION}, ASK_MULTIPLE_PERMISSION_REQUEST_CODE);
        }
    }

}

我可以这样用吗?

【问题讨论】:

  • 你能显示 requestPermission 方法吗?

标签: android android-camera android-permissions android-gps


【解决方案1】:

所以,我从这里看不到你的requestPermission() 方法,但你不应该同时发送多个权限请求。

您应该提出一个具有所有权限的请求。

科特林:

val permissionsCode = 42
val permissions = arrayOf(Manifest.permission.CAMERA, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION)
if (!hasPermissions(this, permissions)) {
    ActivityCompat.requestPermissions(this, permissions, permissionsCode)
}

Java:

int permissionsCode = 42; 
String[] permissions = {Manifest.permission.CAMERA, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_FINE_LOCATION};

if (!hasPermissions(this, permissions)) {
    ActivityCompat.requestPermissions(this, permissions, permissionsCode);
}

【讨论】:

  • Almos 和我的一样,不是吗?
  • 差不多。但 Android 将只显示一个漂亮且动画效果良好的权限对话框。我想这就是目标。 Dialog over dialog 被认为是一种糟糕的界面实践。
  • 1 有时,但会像箭头一样指向下一个。但我没有显示其他对话框。或者我是,但我看不到它完成了?
【解决方案2】:

我的用于检查访问相机和文件权限的代码。

protected void checkPermission(){
        if(ContextCompat.checkSelfPermission(
                context, Manifest.permission.READ_EXTERNAL_STORAGE)
                + ContextCompat.checkSelfPermission(
                context,Manifest.permission.WRITE_EXTERNAL_STORAGE)
                + ContextCompat.checkSelfPermission(
                context, Manifest.permission.CAMERA)
                != PackageManager.PERMISSION_GRANTED){

            // Do something, when permissions not granted
            ActivityCompat.requestPermissions(
                    context,
                    new String[]{
                            Manifest.permission.READ_EXTERNAL_STORAGE,
                            Manifest.permission.WRITE_EXTERNAL_STORAGE,
                            Manifest.permission.CAMERA
                    },
                    MY_PERMISSIONS_REQUEST_CODE
            );

        }else {
            return;
        }
    }

对结果进行管理:

@Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST_CODE: {
                if (
                        (grantResults.length > 0) &&
                                (grantResults[0]
                                        == PackageManager.PERMISSION_GRANTED
                                )
                ) {
                    return;
                } else {
                    // permission was not granted
                    if (ActivityCompat.shouldShowRequestPermissionRationale(
                            context, Manifest.permission.READ_EXTERNAL_STORAGE)
                            || ActivityCompat.shouldShowRequestPermissionRationale(
                            context, Manifest.permission.WRITE_EXTERNAL_STORAGE)
                            || ActivityCompat.shouldShowRequestPermissionRationale(
                            context, Manifest.permission.CAMERA)) {
                        // user denied , but not permanently
                        AlertDialog.Builder builder = new AlertDialog.Builder(context);
                        builder.setIcon(R.drawable.ic_receipt);
                        builder.setMessage("Ops... preciso da sua permissão para incluir sua foto.");
                        builder.setTitle("Atenção");
                        builder.setPositiveButton("OK", (dialogInterface, i) -> ActivityCompat.requestPermissions(
                                context,
                                new String[]{
                                        Manifest.permission.READ_EXTERNAL_STORAGE,
                                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                                        Manifest.permission.CAMERA
                                },
                                MY_PERMISSIONS_REQUEST_CODE
                        ));
                        builder.setNeutralButton("Cancelar", null);
                        AlertDialog dialog = builder.create();
                        dialog.show();
                    } else {
                        Snackbar snackbar = Snackbar.make(findViewById(android.R.id.content), "You denied permission.\n" +
                                "Em Configurações vá em > Permissões > E ative as permissões", Snackbar.LENGTH_LONG).setAction("Configurações", view -> startActivity(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + <**********yourpackagename*************> ))));
                        View snackbarView = snackbar.getView();
                        TextView textView = (TextView) snackbarView.findViewById(com.google.android.material.R.id.snackbar_text);
                        textView.setMaxLines(5);  //Or as much as you need
                        snackbar.show();
                    }
                }
                break;
            }
        }
    }

【讨论】:

    【解决方案3】:

    我遇到了同样的错误,因为我在onCreate 中调用了请求权限的函数ANDonResume 中。我认为它创建了两个权限请求实例,而 Android 系统不希望这样。

    然后,您应该从您的onResume(或与您的活动onCreate 同时运行的任何其他函数中删除权限请求。

    【讨论】:

      【解决方案4】:

      如果您尝试循环获取权限,则该问题可能会重现 -

      do {
       ActivityCompat.requestPermissions...
      }while(some_condition)
      

      在这种情况下,如果条件失败,它可能会再次请求相同的条件。我能够用相同的指令重现这个问题。

      【讨论】:

        【解决方案5】:

        只需在清单文件中添加权限并刷新项目

        在清单 XML 文件中添加此代码:

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

        【讨论】:

          【解决方案6】:

          我认为问题在于您要求两个位置权限,您应该只要求精细位置,这对粗略和精细都适用。

          【讨论】:

          • 我的电脑现在关机了。会尝试后者。
          • 我等不及了。是的,这就是问题所在。谢谢
          • 但有时您需要互斥的权限。为此,请寻找 Vitor Hugo Schwaab 的答案
          【解决方案7】:

          对于遇到此问题的其他人..您需要连续请求权限,如下所示:

          onRequestPermissionResult(){
          case permission1:
           if (permission1.aquired()){
          ....//do what you do
           requestPermission2();
           }
           case permission2:
           if (permission2.aquired()){
          ....//do what you do
           requestPermission3();
           }
          
          }
          

          【讨论】:

          • 是的 - 如果你的代码不能安排在一次调用中请求所有权限,那么你必须编写一堆丑陋的代码来序列化你的权限请求,这样只有一个未完成的一次调用。(如果 Android 能解决这个问题会好得多,而不是每个应用程序都必须重新发明轮子。)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多