Android 使用活动获取:一次只能请求一组权限

Android 使用活动获取:一次只能请求一组权限,android,android-camera,android-permissions,android-gps,Android,Android Camera,Android Permissions,Android Gps,我制作了一个应用程序,其中有一个摄像头和GPS的请求,但当我执行时,我收到这个警告几次,彼此之间的间隔不到1秒 W/活动:一次只能请求一组权限) 有人能告诉我为什么吗 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Intent intent = getIntent(); mStatusCamera = intent.get

我制作了一个应用程序,其中有一个摄像头和GPS的请求,但当我执行时,我收到这个警告几次,彼此之间的间隔不到1秒

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

有人能告诉我为什么吗

@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();
}

我可以这样使用吗?

因此,我在这里看不到您的
requestPermission()
方法,但您不应该同时发送多个权限请求

您应该使用所有权限发出一个请求

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

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

我认为问题在于,您需要两个位置权限,您应该只要求精细位置,这将对粗糙和精细都有效。

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

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

}

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

在清单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/>


如果您试图在循环中获取权限,则可能会出现此问题-

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

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

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


然后,您应该从您的
onResume
(或者从任何其他与活动同时运行的函数
onCreate

可以显示requestPermission方法吗?几乎和我的一样,不是吗?但是Android将只显示一个漂亮且动画效果良好的权限对话框。我想这就是目标。对话框上的对话框被认为是一个糟糕的界面实践e、 1次,但会像箭头一样指向下一个。但我没有在其他对话框上显示对话框。或者我是,但我看不到它完成了?我的计算机现在已关闭。我将尝试后一种方法。我迫不及待。是的,这就是问题所在。ThxB但有时您需要相互排斥的权限。为此,请查找Vitor Hugo SchwaabYep的答案-如果您的不能将代码安排为在一次调用中请求所有权限,那么您必须编写一堆难看的代码来序列化您的权限请求,以便一次只有一个未完成的调用(如果Android能够处理好这一点,而不是每个应用程序都必须重新发明轮子,那会更好)
do {
 ActivityCompat.requestPermissions...
}while(some_condition)