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