Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在颤振插件中请求权限?_Android_Permissions_Flutter - Fatal编程技术网

Android 如何在颤振插件中请求权限?

Android 如何在颤振插件中请求权限?,android,permissions,flutter,Android,Permissions,Flutter,我正在尝试使用一个简单的flatter插件(语音识别包装器),但不知道如何在Android 23或更高版本上请求适当的权限。在省道部分,我有: Future requestPermissions() => _channel.invokeMethod("speech.requestPermissions"); 在Android部分: public class SpeechRecognitionPlugin implements MethodCallHandler, Recog

我正在尝试使用一个简单的flatter插件(语音识别包装器),但不知道如何在Android 23或更高版本上请求适当的权限。在省道部分,我有:

  Future requestPermissions() => 
  _channel.invokeMethod("speech.requestPermissions");
在Android部分:

  public class SpeechRecognitionPlugin implements MethodCallHandler, RecognitionListener,
    PluginRegistry.RequestPermissionResultListener {
插件注册:

  public static void registerWith(Registrar registrar) {
    final MethodChannel channel = new MethodChannel(registrar.messenger(), "speech_recognition");
    SpeechRecognitionPlugin speechRecognitionPlugin = new 
    SpeechRecognitionPlugin(registrar.activity(), channel);
    channel.setMethodCallHandler(speechRecognitionPlugin);
    registrar.addRequestPermissionResultListener(speechRecognitionPlugin);
  }
方法调用:

else if (call.method.equals("speech.requestPermissions")) {
        Log.d(LOG_TAG, "speech.requestPermissions");
        if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
                Manifest.permission.RECORD_AUDIO)) {
            Toast.makeText(activity.getApplicationContext(), "This application needs the Record Audio permission for recognition to work", Toast.LENGTH_LONG).show();
        } else {
            Log.d(LOG_TAG, "Requesting permissions");
            ActivityCompat.requestPermissions(activity,
                    new String[]{Manifest.permission.RECORD_AUDIO},
                    1);
        }
        result.success(hasRecordAudioPermission());
结果回调:

@Override                                                                                            
public boolean onRequestPermissionResult(int requestCode, String[] permissions, int[] grantResults) {
    boolean granted = false;
    switch (requestCode) {
        case 1: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                granted = true;
            }
            speechChannel.invokeMethod("speech.onPermission", granted);
            return true;
        }
    }
    return false;
}
从logcat中,我看到“speech.requestPermissions”调用发生了,但没有显示标准的Android系统权限请求,只是logcat中的这一点可能相关:

D/ViewRootImpl(21171): #1 mView = android.widget.LinearLayout{64f050b 
V.E...... ......I. 0,0-0,0 #102039d android:id/toast_layout_root}
D/ViewRootImpl(21171): MSG_RESIZED_REPORT: ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=1
D/ViewRootImpl(21171): #3 mView = null
什么是为Flutter插件请求权限的正确方法

编辑:当对话框正确显示时,这不适用于第一次运行,但适用于用户最初未授予权限或通过设置撤销权限时的后续运行。我意识到这会显著改变问题(使其看起来像边缘案例),但Android权限不应该以这种方式工作


编辑:权限存在于AndroidManifest.xml中

我有此工作用于位置权限。我所做的唯一不同的事情是在这里调用您的方法:

ActivityCompat.requestPermissions(activity,
                new String[]{Manifest.permission.RECORD_AUDIO},
                1);
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Add this -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <!-- Flutter stuff --->
</manifest>
我没有使用“ActivityCompat”,而是将注册器存储在本地final变量中,并执行以下操作:

registrar.activity().requestPermissions(activity,
                new String[]{Manifest.permission.RECORD_AUDIO},
                1);
编辑:还要确保在AndroidManifest.xml中包含了相关权限

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- Add this -->
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

    <!-- Flutter stuff --->
</manifest>

使用

请求许可
import'package:permissions\u plugin/permissions\u plugin.dart';
映射权限=等待权限pugin
.requestPermissions([
Permission.ACCESS\u FINE\u位置,
Permission.ACCESS\u rough\u位置,
Permission.READ\u PHONE\u状态
]);
检查状态权限
import'package:permissions\u plugin/permissions\u plugin.dart';
映射权限=等待权限pugin
.检查权限([
Permission.ACCESS\u FINE\u位置,
Permission.ACCESS\u rough\u位置,
Permission.READ\u PHONE\u状态
]);

感谢您确保这至少是一条路要走。我已经编辑了这个问题,第一次运行有效,但动态请求权限无效。很抱歉之前没有提及。您还必须将权限添加到清单中(如果您还没有这样做的话)。查看我编辑的答案以获取示例如何检查权限是否已授予?我正在我的插件中使用它:PermissionChecker.checkSelfPermission(registrator.activity(),Manifest.permission.ACCESS\u\u LOCATION)!=PackageManager.PERMISSION\u GRANTEDint permissionCheck=ContextCompat.checkSelfPermission(活动、清单、权限、录制\u音频);返回(permissionCheck==PackageManager.PERMISSION\u已授予);当我得到代码时,我将尝试你的版本。不幸的是,没有更改。现在我想了想,我不知道我对这次更改的期望是什么,权限请求调用也没什么不同。在这个包中提到,它现在只支持android。