2013-02-26 2 views
1

В настоящее время я пытаюсь воспроизвести файл MP3 с SDCard. К сожалению, я не могу этого сделать.MediaPlayer: SecurityException в prepareAsync()

Вот что я пробовал:

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 выход я не могу понять, в чем проблема.

Я надеюсь, что кто-то может мне помочь.

ответ

3

Я предполагаю, что вы вызываете getFD() на закрытом FileInputStream. При закрытии поток, скорее всего, получил недопустимый дескриптор файла, и вы устанавливаете его как источник данных для своего MediaPlayer.

+0

Спасибо. После большого редактирования моего кода я должен полностью контролировать это. – Siggy

+0

@ Сигги вы можете подробно рассказать о том, что именно вы сделали именно для решения проблемы? – dangalg

+0

О, это было давно: D Ну, это была действительно глупая ошибка: Проблемные строки: 'fileInputStream.close(); _mediaPlayer.setDataSource (fileInputStream.getFD()); ' Здесь вы видите, что я закрыл файлInputStream и попытался получить FD впоследствии. Это явно не работает. – Siggy

Смежные вопросы