1

現在、SDCard から MP3 ファイルを再生しようとしています。残念ながら、私はそれを行うことができません。

これが私が試したものです:

private MediaPlayer _mediaPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        _mediaPlayer = new MediaPlayer();
    }

    public void playButtonClick(View v) {
        File sdcard = new File(Environment.getExternalStorageDirectory()
                .getAbsolutePath());
        File dir = new File(sdcard, "Music/Undone.mp3");

        _mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        _mediaPlayer.setOnErrorListener(new OnErrorListener() {

            @Override
            public boolean onError(MediaPlayer mp, int what, int extra) {
                android.util.Log.d("Error", "What? " + String.valueOf(what)
                        + "  Extra?" + String.valueOf(extra));
                return false;
            }
        });
        _mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                _mediaPlayer.start();
            }
        });
        try {
            FileInputStream fileInputStream = new FileInputStream(dir);
            fileInputStream.close();
            _mediaPlayer.setDataSource(fileInputStream.getFD());
            _mediaPlayer.prepareAsync();
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

問題は、 をSecurityException呼び出すときに が得られること_mediaPlayer.prepareAsync()です。エラーメッセージは次のとおりです。

02-26 22:11:19.020: W/System.err(26048): java.lang.SecurityException
02-26 22:11:19.020: W/System.err(26048):    at android.media.MediaPlayer.prepareAsync(Native Method)
02-26 22:11:19.025: W/System.err(26048):    at com.bert.bertmusicplayer.MainActivity.playButtonClick(MainActivity.java:53)
02-26 22:11:19.025: W/System.err(26048):    at java.lang.reflect.Method.invokeNative(Native Method)
02-26 22:11:19.025: W/System.err(26048):    at java.lang.reflect.Method.invoke(Method.java:511)
02-26 22:11:19.025: W/System.err(26048):    at android.view.View$1.onClick(View.java:3686)
02-26 22:11:19.025: W/System.err(26048):    at android.view.View.performClick(View.java:4211)
02-26 22:11:19.025: W/System.err(26048):    at android.view.View$PerformClick.run(View.java:17267)
02-26 22:11:19.025: W/System.err(26048):    at android.os.Handler.handleCallback(Handler.java:615)
02-26 22:11:19.025: W/System.err(26048):    at android.os.Handler.dispatchMessage(Handler.java:92)
02-26 22:11:19.025: W/System.err(26048):    at android.os.Looper.loop(Looper.java:137)
02-26 22:11:19.025: W/System.err(26048):    at android.app.ActivityThread.main(ActivityThread.java:4898)
02-26 22:11:19.025: W/System.err(26048):    at java.lang.reflect.Method.invokeNative(Native Method)
02-26 22:11:19.025: W/System.err(26048):    at java.lang.reflect.Method.invoke(Method.java:511)
02-26 22:11:19.025: W/System.err(26048):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
02-26 22:11:19.025: W/System.err(26048):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
02-26 22:11:19.025: W/System.err(26048):    at dalvik.system.NativeStart.main(Native Method)

ここに私の許可があります:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" >

Logcat の出力だけでは、何が問題なのかわかりません。

誰かが私を助けてくれることを願っています。

4

1 に答える 1

3

原因は、あなたが close を呼び出しgetFD()ていることだと思いますFileInputStream。ストリームを閉じたときに、無効なファイル記述子を取得した可能性があり、それを のデータ ソースとして設定していますMediaPlayer

于 2013-02-26T21:28:45.320 に答える