FlutterPluginでAndroidのカメラを使用したいがPermissionの許可ができない
SkywayをFlutterにインポートしようとしています。
まず検索するとこの記事が出てきて、
この通りやってiOSの方は問題なくできたのでAndroidの方を実装しています。
Flutterからネイテイブコードを呼び出すにはFlutterPluginにしたほうが良さそうで
iOSのサンプルコードもFlutterPluginにしてありました。(FlutterPlugin)
そして、Qiitaの記事の下の方に
まず検索するとこの記事が出てきて、
この通りやってiOSの方は問題なくできたのでAndroidの方を実装しています。
Flutterからネイテイブコードを呼び出すにはFlutterPluginにしたほうが良さそうで
iOSのサンプルコードもFlutterPluginにしてありました。(FlutterPlugin)
そして、Qiitaの記事の下の方に
今回利用した SkyWay SDK ですが、CVPixelBuffer の取得する手段は用意されておらず、ビデオを表示するには UIView を継承した専用のクラスを利用するしかないようでした。(低レイヤを意識せず利用できることは素晴らしいことですが)
そのため、今回は PlatformView を使ってビデオ表示を行いました。
とあったのでPlatformViewで実装しなければならず、これを参考にしながら作成しました。
また、SkywayのSDKがJavaしか無いのでKotlinではなくJavaで実装。
SDKであるaarファイルを{project_name}/android/libsにインポートし、build.gradleの
また、SkywayのSDKがJavaしか無いのでKotlinではなくJavaで実装。
SDKであるaarファイルを{project_name}/android/libsにインポートし、build.gradleの
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar'])
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
}repositories {
flatDir {
dirs 'libs'
}
}
で読み込み。
{project_name}/android/{package_name}/FlutterSkywayPluginがFlutterから呼ばれるので
記事を参考にしながらFlutterSkywayViewにSkywayサーバーとの接続を実装しました。
最初はAndroid端末のconnectをタップすると
もちろん、example/android/app/src/main/AndroidManifest.xmlに以下は追記済み。
{project_name}/android/{package_name}/FlutterSkywayPluginがFlutterから呼ばれるので
記事を参考にしながらFlutterSkywayViewにSkywayサーバーとの接続を実装しました。
最初はAndroid端末のconnectをタップすると
java.lang.SecurityException: validateClientPermissionsLocked:1242: Caller "{package_name}.skyway_flutter_sdk_example" (PID 10398, UID 14036) cannot open camera "1" without camera permission
というエラーが発生しクラッシュしました。もちろん、example/android/app/src/main/AndroidManifest.xmlに以下は追記済み。
<uses-feature android:name="android.hardware.camera2" />
<uses-feature android:name="android.hardware.camera2.autofocus" />
<uses-feature android:glEsVersion="0x00020000" android:required="true" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK"/>
SkywayAndroidSDKのコードを参考にFlutterSkywayViewの152行目でcheckPermissionを呼び出し、以下のコードを224行目から追加しました。
private void checkPermission() {
Activity _activity = getActivity();
if (ContextCompat.checkSelfPermission(_context,
Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(_context,
Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(_activity,new String[]{Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO},0);
}
else {
startLocalStream();
}
}`@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
switch (requestCode) {
case 0: {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
startLocalStream();
}
else {
}
return;
}
}
}
ContextとActivityが引数で必要だったのでFlutterActivityの継承を行いました。
しかし、requestPermissionsのところで以下のエラーが吐かれクラッシュ。
端末側のアプリ情報から権限の許可をするとクラッシュはせずにカメラも使用できSkywayのサーバーに接続して
ビデオ通話の通信を行うことはできました。
しかし、これも
とエラーが出るのでやはりカメラの使用権限を使う時に許可する必要だと思っています。
Android側を疑って調べていますがFlutter側やPlugin関連かもしれないとも思っています。
権限付与の方法がわかる方いらっしゃいますか?
しかし、requestPermissionsのところで以下のエラーが吐かれクラッシュ。
java.lang.NullPointerException: Attempt to invoke virtual method '
android.content.pm
.PackageManager android.content.Context.getPackageManager()' on a null object reference
端末側のアプリ情報から権限の許可をするとクラッシュはせずにカメラも使用できSkywayのサーバーに接続して
ビデオ通話の通信を行うことはできました。
しかし、これも
android.hardware.camera2.CameraAccessException: CAMERA_DISCONNECTED (2): cancelRequest:473: Camera device no longer alive
とエラーが出るのでやはりカメラの使用権限を使う時に許可する必要だと思っています。
Android側を疑って調べていますがFlutter側やPlugin関連かもしれないとも思っています。
権限付与の方法がわかる方いらっしゃいますか?
サインインしてコメントを残してください。
コメント
0件のコメント