問題タブ [runtime-permissions]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - 実行時にアクセス許可を拒否して許可した後、Android アプリで FileNotFoundException を取得する
SDカードからmp3を再生するアプリを取得しようとしています。Windows 8のAndroidスタジオでAndroid SDKバージョン23を使用しています。これをnexus 5エミュレーターで実行しています。
実行時にアクセス許可を要求していますが、アクセス許可を一度拒否すると、2 番目の要求でアクセス許可を付与するよりも FileNotFoundException が発生します。アプリを再起動すると、音楽ファイルを再生できます。最初の試行で許可要求を受け入れると、再起動しなくても音楽を正常に再生できます。
問題を再現する簡単なプログラムを作成し、githubに投稿しました。このアプリを実行するには、/Music ディレクトリに mp3 ファイルが必要です。
ストレージの許可を求めるコードは次のとおりです。
失敗している関連するコード スニペットは次のとおりです。
そして、ここにスタックトレースがあります:
MediaPlayer: 作成に失敗しました: java.io.FileNotFoundException: /storage/emulated/0/Music/108-radiohead-house of cards-pms.mp3: オープンに失敗しました: libcore.io.IoBridge.open(IoBridge で EACCES (許可が拒否されました) .java:452) で java.io.FileInputStream.(FileInputStream.java:76) で android.media.MediaPlayer.setDataSource(MediaPlayer.java:1095) で android.media.MediaPlayer.setDataSource(MediaPlayer.java:1074) で android.media.MediaPlayer.setDataSource(MediaPlayer.java:1028) で android.media.MediaPlayer.setDataSource(MediaPlayer.java:973) で android.media.MediaPlayer.create(MediaPlayer.java:880) で android. media.MediaPlayer.create(MediaPlayer.java:857) で android.media.MediaPlayer.create(MediaPlayer.java:836) で gunboat.com.mediaplayererror.FullscreenActivity.playSong(FullscreenActivity.java:190) で gunboat.com.mediaplayererror.FullscreenActivity.CheckPermission(FullscreenActivity.java:135) で gunboat.com.mediaplayererror.FullscreenActivity.access$300(FullscreenActivity.java:24) で gunboat.com.mediaplayererror. FullscreenActivity$5.onClick(FullscreenActivity.java:113) で android.view.View.performClick(View.java:5198) で android.view.View$PerformClick.run(View.java:21147) で android.os.Handler.handleCallback(Handler.java:739) で android.os.Handler.dispatchMessage(Handler.java:95) で android.os.Looper.loop(Looper.java:148) で android. com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) で 原因: android.system.ErrnoException: オープンに失敗しました: libcore.io.Posix.open(ネイティブ メソッド) で EACCES (許可が拒否されました) libcore.io.BlockGuardOs.open(BlockGuardOs.java:186) で libcore.io.IoBridge.open(IoBridge.java:438) で java.io.FileInputStream.(FileInputStream.java:76) android.media.MediaPlayer.setDataSource(MediaPlayer.java:1095) で android.media.MediaPlayer.setDataSource(MediaPlayer.java:1074) で android.media.MediaPlayer.setDataSource(MediaPlayer.java:1028) で android. media.MediaPlayer.setDataSource(MediaPlayer.java:973) で android.media.MediaPlayer.create(MediaPlayer.java:880) で android.media.MediaPlayer.create(MediaPlayer.java:857) android.media.MediaPlayer.create(MediaPlayer.java:836) で gunboat.com.mediaplayererror.FullscreenActivity.playSong(FullscreenActivity.java:190) で gunboat.com.mediaplayererror.FullscreenActivity.CheckPermission(FullscreenActivity.java:135) ) gunboat.com.mediaplayererror.FullscreenActivity.access$300(FullscreenActivity.java:24) で gunboat.com.mediaplayererror.FullscreenActivity$5.onClick(FullscreenActivity.java:113) android.view.View.performClick(View.java:5198) で android.view.View$PerformClick.run(View.java:21147) で android.os.Handler.handleCallback(Handler.java:739) でandroid.os.Handler.dispatchMessage(Handler.java:95) で android.os.Looper.loop(Looper.java:148) で android.app.ActivityThread.main(ActivityThread.java:5417)5417)5417)5198) で android.view.View$PerformClick.run(View.java:21147) で android.os.Handler.handleCallback(Handler.java:739) で android.os.Handler.dispatchMessage(Handler.java:95) でandroid.os.Looper.loop(Looper.java:148) で android.app.ActivityThread.main(ActivityThread.java:5417)5198) で android.view.View$PerformClick.run(View.java:21147) で android.os.Handler.handleCallback(Handler.java:739) で android.os.Handler.dispatchMessage(Handler.java:95) でandroid.os.Looper.loop(Looper.java:148) で android.app.ActivityThread.main(ActivityThread.java:5417)Handler.handleCallback(Handler.java:739) で android.os.Handler.dispatchMessage(Handler.java:95) で android.os.Looper.loop(Looper.java:148) で android.app.ActivityThread.main(ActivityThread) .java:5417)Handler.handleCallback(Handler.java:739) で android.os.Handler.dispatchMessage(Handler.java:95) で android.os.Looper.loop(Looper.java:148) で android.app.ActivityThread.main(ActivityThread) .java:5417)メイン (ActivityThread.java:5417)メイン (ActivityThread.java:5417)
android - フラグメントは破棄されませんが、onCreateView が呼び出されます
私には がありActivity
、それには がありViewPager
ます。これはを使用してViewPager
ロードされます。私の各フラグメントはセクションと見なされます(アプリの機能による)。最初は一度使用してすべてのアイテムをロードしますが、Fragments
Adapter
ViewPager
viewPager.setOffscreenPageLimit(sectionList.size()); //sectionList is nothing but number of framgents
フラグメントには、フラグメントの作成中にクラスsetup
から呼び出される関数があります。Adapter
調査フラグメント
調査アダプター
ここで、SectionView
は class によって拡張された抽象クラスSimpleSection
です。その中にカスタムビューSimpleSection
を追加します。カスタム ビューは、約 20 ~ 30 のビュー クラスのようなものです。
ここまでは大丈夫です。しかし、SectionView を保持できないいくつかのシナリオでは、null になります。ここにシナリオがあります、
カスタムカメラの実装があり、フラグメントからカスタムカメラを開き(フラグメントまたはアクティビティを破壊せずに)、画像をキャプチャし、フラグメントに戻って
onCreateView()
時々呼び出されるため、sectionView
nullになります。デバッグすると、ライフサイクル メソッドが呼び出されません (onDestroyView()
、onDestroy()
、onDetach()
、onLowMemeory()
などonConfigurationChanged()
)。では、どのようonCreateView()
に呼び出すことができますか?Nexus 9 では、実行時のパーミッションを変更すると同じことが起こりました。
Fragment
ステータス バーを下にスクロールし、[設定] > [アプリ] > [アプリのアクセス許可] > [位置情報] > [位置情報のアクセス許可を取り消す] に移動します。パーミッションを付与するとクラッシュしませんが、セクションビュー オブジェクトを取り消すと null になります
WEIRD BEHAVIOR : 2 番目のシナリオを確認するために、デバッガーを接続して、Location
権限の取り消し中にフラグメント/アクティビティが破棄されているかどうかを確認しました。場所のアクセス許可を取り消すとすぐに、デバッガーが切断され、アプリケーションが強制終了/DEAD されました。これは、権限を取り消すたびに発生します。
sectionView
オブジェクトが保持されているか、破棄されていないことを確認するにはどうすればよいですか?
android - アクセス許可が取り消された場合、アプリケーションの再起動時にアクセス許可要求ダイアログが保持される
私のアプリケーションは Android Marshmallow (API レベル 23) を対象としており、以下のリンクの開発者ガイドに従って実行時アクセス許可を実装しています。 https://developer.android.com/training/permissions/requesting.html。
この要求許可モデルは正常に機能しています。
画面にアクセス許可要求のポップアップが表示されている場合、ユーザーが[設定] -> [アプリ] -> [マイ アプリケーション名] -> [アクセス許可]にアクセスして既に付与されているアクセス許可を取り消し、マイ アプリケーションに切り替えると、アプリケーションが再起動されます。ただし、既に開かれている許可要求ダイアログは引き続き表示されます。
そのため、再起動時に画面に既に表示されている許可要求ダイアログを閉じるための解決策を提案してください。
android - フラグメントを使用した実行時の Android アクセス許可
私のプロジェクトには、xml (メイン) に 2 つのフラグメントを持つアクティビティがあります。
ご覧のとおり、そのうちの 1 つがマップ フラグメントです。問題は、setContentView()
が実行されているときにアプリが API 23 でクラッシュすることです。ドキュメントを使用して以前に (場所) アクセス許可のチェックを試みましsetContentView()
たが、アプリは引き続きクラッシュします。何か案が?
android - Android Marshmallow: 権限の取り消しと UI テスト
Android Marshmallow のアプリから権限 (場所など) を取り消すと、アプリのプロセスが終了します。さまざまなケース (権限の有効化/無効化) をテストする UI テストでこれを処理する方法はありますか? UIAutomator を使用してアプリ設定で権限を設定しようとすると、権限が取り消された直後にアプリが終了するため、クラッシュが発生します。洞察/コメントに感謝します!
android - Android 6.0 で実行時の記録許可をリクエストするにはどうすればよいですか?
Android 6.0 以降、アプリの実行時にパーミッションをリクエストする必要があります。
私のアプリでは、ローカル ストレージ、カメラ、位置情報、および音声録音のアクセス許可を使用しています。
したがって、ローカル ストレージ、カメラ、地理位置情報の要求は、そのスニペットで問題ありません: https://github.com/appcelerator-developer-relations/appc-sample-ti510/blob/master/app/controllers/permissions.js
しかし、私は録音許可を要求する方法を見つけていません...私は実際にAndroid用のtitutorial.audiorecorderモジュールを使用していますが、録音の許可が有効になっていないため、Android 6.0以降に録音しようとするとクラッシュします。
私の環境に関する詳細情報:
tiapp.xml
android-6.0-marshmallow - 外部ストレージから読み取るための Android m ランタイム権限
tabLayout を 5 つのセクションでロードするダイアログがあり、そのコンテンツは ViewPager アダプタを使用して ViewPager を使用してロードされます。さて、セクションの 1 つで、ギャラリーから画像をロードする必要があります。実行時パーミッションを記述しましたが、アクティビティを持たないクラスにこのダイアログを実装したため、パーミッションのコールバックを使用できません。アクティビティのないクラスでパーミッションのコールバック メソッドを実装する方法がわかりません。
public void makePermissionRequest(){
if(ContextCompat.checkSelfPermission(showEditorActivity, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(showEditorActivity,
new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, permission_request_code);
}else{
fetchImagesFromDevice();
}
}
そしてコールバックのために..