【问题标题】:Android: Couldn't ask permissionsAndroid:无法请求权限
【发布时间】:2023-02-18 12:11:12
【问题描述】:

我很久以前就学会了如何在 Android 中编写代码,并且已经有一段时间没有接触过它了。现在我想用蓝牙模块 (HC-05) 控制电机,并且正在使用 Android Studio 重新学习 Android。呜呜……

显然,他们改变了获取权限的方式,无论出于何种原因,现在它变得超级复杂。我做了一些研究,但我仍然无法让我的手机弹出“此应用程序正在请求这些权限”的弹出窗口。你能帮我解决这个问题吗?这是我请求权限的最基本代码:

“ Android Studio 大黄蜂 | 2021.1.1 补丁 2 Build #AI-211.7628.21.2111.8193401,建于 2022 年 2 月 17 日 运行时版本:11.0.11+9-b60-7590822 amd64 VM:Oracle Corporation 的 OpenJDK 64 位服务器 VM 视窗 10 10.0 GC:G1年轻代,G1老年代 内存:1280M 核心数:12 注册表:external.system.auto.import.disabled=true “

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.bluetoothandpermissions">
    <uses-permission android:name="android.permission.BLUETOOTH"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE"/>
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
    <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.BluetoothAndPermissions">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

</manifest>

主活动.java

package com.example.bluetoothandpermissions;

import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.content.ContextCompat;
import android.Manifest;
import android.content.pm.PackageManager;
import android.os.Bundle;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;

public class MainActivity extends AppCompatActivity {
    
    ActivityResultLauncher<String[]> nPermissionResultLauncher;
    
    private boolean isBluetoothPermissionGranted = false;
    private boolean isBluetoothAdminPermissionGranted = false;
    private boolean isBluetoothConnectPermissionGranted = false;
    private boolean isBluetoothScanPermissionGranted = false;
    private boolean isBluetoothAdvertisePermissionGranted = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nPermissionResultLauncher = registerForActivityResult(new ActivityResultContracts.RequestMultiplePermissions(), new ActivityResultCallback<Map<String, Boolean>>() {
            @Override
            public void onActivityResult(Map<String, Boolean> result) {
                if(result.get(Manifest.permission.BLUETOOTH) != null){
                    isBluetoothPermissionGranted = result.get(Manifest.permission.BLUETOOTH);
                }
                if(result.get(Manifest.permission.BLUETOOTH_ADMIN) != null){
                    isBluetoothAdminPermissionGranted = result.get(Manifest.permission.BLUETOOTH_ADMIN);
                }
                if(result.get(Manifest.permission.BLUETOOTH_CONNECT) != null){
                    isBluetoothConnectPermissionGranted = result.get(Manifest.permission.BLUETOOTH_CONNECT);
                }
                if(result.get(Manifest.permission.BLUETOOTH_SCAN) != null){
                    isBluetoothScanPermissionGranted = result.get(Manifest.permission.BLUETOOTH_SCAN);
                }
                if(result.get(Manifest.permission.BLUETOOTH_ADVERTISE) != null){
                    isBluetoothAdvertisePermissionGranted = result.get(Manifest.permission.BLUETOOTH_ADVERTISE);
                }

            }
        });
        
        requestPermission();
        
    }

    private void requestPermission(){

        isBluetoothPermissionGranted = ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.BLUETOOTH
        ) == PackageManager.PERMISSION_GRANTED;

        isBluetoothAdminPermissionGranted = ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.BLUETOOTH_ADMIN
        ) == PackageManager.PERMISSION_GRANTED;

        isBluetoothConnectPermissionGranted = ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.BLUETOOTH_CONNECT
        ) == PackageManager.PERMISSION_GRANTED;

        isBluetoothScanPermissionGranted = ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.BLUETOOTH_SCAN
        ) == PackageManager.PERMISSION_GRANTED;

        isBluetoothAdvertisePermissionGranted = ContextCompat.checkSelfPermission(
                this,
                Manifest.permission.BLUETOOTH_ADVERTISE
        ) == PackageManager.PERMISSION_GRANTED;

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

        if (!isBluetoothPermissionGranted){
            permissionRequest.add(Manifest.permission.BLUETOOTH);
        }
        if (!isBluetoothAdminPermissionGranted){
            permissionRequest.add(Manifest.permission.BLUETOOTH_ADMIN);
        }
        if (!isBluetoothConnectPermissionGranted){
            permissionRequest.add(Manifest.permission.BLUETOOTH_CONNECT);
        }
        if (!isBluetoothScanPermissionGranted){
            permissionRequest.add(Manifest.permission.BLUETOOTH_SCAN);
        }
        if (!isBluetoothAdvertisePermissionGranted){
            permissionRequest.add(Manifest.permission.BLUETOOTH_ADVERTISE);
        }

        if (!permissionRequest.isEmpty()){
            nPermissionResultLauncher.launch(permissionRequest.toArray(new String[0]));
        }
    }
}

我尝试了我在 youtube 视频上看到的内容 https://www.youtube.com/watch?v=nkayHRT8D_w

看过这个,但它并不是真正的示例代码,所以对我帮助不大[我又笨又懒,所以我需要示例]: https://developer.android.com/training/permissions/requesting

这个网站 https://www.geeksforgeeks.org/android-how-to-request-permissions-in-android-application/

在这里检查其他人有类似的问题 Why does my Android app not request permissions on install?

我想得到这样的东西: 但是我一直都是0权限设置:

【问题讨论】:

    标签: android android-permissions android-bluetooth


    【解决方案1】:

    改变了这个:

    <permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <permission android:name="android.permission.INTERNET" />
    

    对此:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INTERNET" />
    

    并且出现了请求对话框:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      相关资源
      最近更新 更多