问题:ActivityCompat.请求没有向用户显示对话框,而是自动拒绝权限.Access_ground_LOCATION和Access_FINE_LOCATION都会发生这种情况.

我已经在stackover上try 了建议的解决方案,但没有成功.所以我决定按照建议制作一个极简项目,它只有一个MainActive,只要求位置权限并显示"拒绝"/"授予"消息.

调试时,我可以看到onReportPermissionsResponse对于两个权限的响应都是-1(在int[] grantEffects中),这意味着权限被拒绝,但请求权限的对话框从未弹出.如果我清除所有应用程序数据并卸载应用程序并再次重新安装,也会发生这种情况(以防用户在某个时候按下"不要再问我").完成此操作后,我判断Android设备上的配置,在应用程序权限中,我可以看到位置位于"拒绝"类别中.

我正在Android 11上进行测试.

这是MainActivity.java:

package com.example.robotito_calibration;

import android.Manifest;
import android.app.Activity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;    
import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        List<String> permissionsNeeded = new ArrayList<>();

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
        }

        if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_BACKGROUND_LOCATION) != PackageManager.PERMISSION_GRANTED) {
            permissionsNeeded.add(Manifest.permission.ACCESS_BACKGROUND_LOCATION);
        }

        if (!permissionsNeeded.isEmpty()) {
            ActivityCompat.requestPermissions((Activity) this,
                    permissionsNeeded.toArray(new String[0]),
                    1);
        }

    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        if (requestCode == 1) {
            // Check if the permission was granted
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission granted, you can proceed with your task
                Toast.makeText(this, "Granted", Toast.LENGTH_LONG).show();
            } else {
                Toast.makeText(this, "Denied", Toast.LENGTH_LONG).show();
                // Permission denied, show a message or take appropriate action
            }
        }
    }

}

这是我的 list 文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.robotito_calibration">

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

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Robotito_Calibration">
        <activity
            android:name=".MainActivity"
            android:screenOrientation="portrait"
            android:label="@string/app_name"
            android:theme="@style/Theme.Robotito_Calibration.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Build.gradle:

plugins {
    id 'com.android.application'
}

android {
    compileSdkVersion 30

    defaultConfig {
        applicationId "com.example.robotito_calibration"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {

    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'com.google.android.material:material:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.navigation:navigation-fragment:2.2.2'
    implementation 'androidx.navigation:navigation-ui:2.2.2'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
}

推荐答案

答案就在我的 comments 中;-).

Java相关问答推荐

Spring Boot找不到Mapper bean

Java -使用空比较或instanceof?

Proguard配置以保留具有参数的注释的成员

如何转换Tue Feb 27 2024 16:35:30 GMT +0800 String至ZonedDateTime类型""

Select 按位运算序列

Jlink选项&-strie-ative-Commands";的作用是什么?

如何修复IndexOutOfBoundsException在ClerView适配器的onRowMoved函数?

Spark上下文在向Spark提交数据集时具有内容,但Spark在实际构建它时发现它为空

RichFaces 3.x-Spring Boot-迁移web.xml

将关键字与正文中的_Allowed匹配,但带有__Signing可选后缀

将响应转换为带值的键

尽管通过中断请求线程死亡,但线程仍将继续存在

声明带有泛型的函数以用作查找映射中的值

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

如何在ImageIO或十二只猴子中旋转TIFF CMYK图像?

如果执行@BeForeEach#repository.save(),则测试中的UnitTest最终UUID会发生更改

用于Java的Visual Studio代码完成不起作用

如何制作回文程序?

如何在Spring Boot Auth服务器上正确配置CORS?

ReturnedRect在升级后反转