3

SDカードからmp3を再生するアプリを取得しようとしています。Windows 8のAndroidスタジオでAndroid SDKバージョン23を使用しています。これをnexus 5エミュレーターで実行しています。

実行時にアクセス許可を要求していますが、アクセス許可を一度拒否すると、2 番目の要求でアクセス許可を付与するよりも FileNotFoundException が発生します。アプリを再起動すると、音楽ファイルを再生できます。最初の試行で許可要求を受け入れると、再起動しなくても音楽を正常に再生できます。

問題を再現する簡単なプログラムを作成し、githubに投稿しました。このアプリを実行するには、/Music ディレクトリに mp3 ファイルが必要です。

ストレージの許可を求めるコードは次のとおりです。

 private void CheckPermission() {

    int permissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE);

    if (permissionCheck == PackageManager.PERMISSION_GRANTED) {
        playSong();
    } else {
        // we don't have permission, request it
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                REQUEST_EXTERNAL_STORAGE_PERMISSION);

    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    switch (requestCode) {
        case REQUEST_EXTERNAL_STORAGE_PERMISSION:
            if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // Permission Granted
                Toast.makeText(getApplicationContext(), "Storage access granted, touch screen to start music", Toast.LENGTH_SHORT)
                        .show();
            } else {
                // Permission Denied
                Toast.makeText(getApplicationContext(), "Storage access denied, can't load music", Toast.LENGTH_SHORT)
                        .show();
            }
            break;
        default:
            super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

失敗している関連するコード スニペットは次のとおりです。

 Uri uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
    String projection[] =
            {android.provider.MediaStore.Audio.Media.DATA, android.provider.MediaStore.Audio.Media.TITLE};
    Cursor cursor = this.getContentResolver().query(uri, projection, null, null, null);
    String songURI = new String();
    String title = new String();

    while (cursor.moveToNext()) {
        String data = cursor.getString(0);
        title = cursor.getString(1);
        // Note: Look for music folder in root drive.
        if (data.matches("^/storage/emulated/0/Music/.*")) {
            songURI = data;
            break;
        }
    }
    if (cursor != null) {
        cursor.close();
    }

    if (mediaPlayer != null) {
        mediaPlayer.stop();
        mediaPlayer.release();
        mediaPlayer = null;
    }

    mediaPlayer = MediaPlayer.create(getApplicationContext(), Uri.parse(songURI));

    try
    {
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mediaPlayer.start();
        Toast toast = Toast.makeText(getApplicationContext(), title, Toast.LENGTH_SHORT);
        toast.show();
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
        return;
    }

そして、ここにスタックトレースがあります:

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) 

4

1 に答える 1