2017-02-25 78 views
-1

我是新手。我只想在我的應用程序中播放mp3。 我已閱讀文檔,並瀏覽了許多網站,包括本文。 的步驟應該是從存儲器播放mp3的最簡單方法

MediaPlayer.setDataSource(String) or (context, Uri) 
.prepare(); 
.start(); 

我的文件是/storage/emulated/0/New Folder/ztz3.mp3 .. 如果我使用External.getExternalDirectory().getPath()結果是/storage/emulated/0/

,但它只是不會玩。 我瀏覽過很多網站..嘗試很多東西,但它只是沒有工作。 我已經使用權限來讀取外部存儲。

和我瀏覽的網站有太多不同的答案,只會讓我更困惑。一些使用AudioManager.STREAM的有些使用MediaPlayer.create。 我也跟着那個......但它不會玩。


public class MainActivity extends AppCompatActivity { 
    Button buttonPlay; 
    MediaPlayer mediaPlayer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button buttonPlay = (Button) findViewById(R.id.buttonPlay); 

    //  String filePath = Environment.getExternalStorageDirectory()+ 
    //    "/New Folder/ztz_3_adding.mp3"; 
    //  String filePath = "/storage/emulated/0/New Folder/ztz_3_adding.mp3"; 
     Log.e("Dir", Environment.getExternalStorageDirectory().toString()); 
     Log.e("Directory", Environment.getExternalStorageDirectory().getPath()); 

     mediaPlayer = new MediaPlayer(); 
     //mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 

     try { 
      // mediaPlayer.setDataSource("/storage/emulated/0/New Folder/ztz_3_adding.mp3"); 
      // mediaPlayer.setDataSource("file://storage/emulated/0/New Folder/ztz_3_adding.mp3"); 
      mediaPlayer.setDataSource(getApplicationContext(), 
        Uri.parse(Environment.getExternalStorageDirectory().getPath()+ 
          "/New Folder/ztz_3_adding.mp3")); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     try { 
      mediaPlayer.prepare(); 
      //mediaPlayer.prepareAsync(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     buttonPlay.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mediaPlayer.start(); 

      } 
     }); 


    } 
} 

我認爲這個問題是在準備()方法..但我不知道如何解決它。 我已閱讀並嘗試過使用靜態MediaPlayer.create或其他內容的網站。

我只是想要一個簡單的媒體播放器,使用字符串值,我可以隨時更改播放基於佈局的MP3文件。

感謝之前的幫助......


日誌...

02-25 22:10:08.546 17345-17345/com.echo.tesmediaplayer E /迪爾: /storage/emulated/0 02-25 22:10:08.548 17345-17345/com.echo.tesmediaplayer E/Directory:/ storage/emulated/0 02-25 22:10:08.563 17345-17345 /? E/MediaPlayer:在 狀態下調用prepareAsync 1 02-25 22:10:08.564 17345-17345 /? E/AndroidRuntime:致命 例外:主

過程:com.echo.tesmediaplayer,PID:17345 了java.lang.RuntimeException:無法啓動活動 ComponentInfo {com.echo.tesmediaplayer/com.echo.tesmediaplayer。 MainActivity}:java.lang.IllegalStateException

在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2440) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2500)在 android.app .ActivityThread.access $ 900(ActivityThread.java:163)at android.app.ActivityThread $ H.han dllMessage(ActivityThread.java:1362)at android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:148)at android.app.ActivityThread.main( ActivityThread.java:5585)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:730) at com.android.internal .os.ZygoteInit.main(ZygoteInit.java:620)

引起:java.lang。 IllegalStateExceptionat android.media.MediaPlayer。_prepare(本機方法)在 android.media.MediaPlayer.prepare(MediaPlayer.java:1158)在 com.echo.tesmediaplayer.MainActivity.onCreate(MainActivity.java:48) 在android.app.Activity.performCreate (Activity.java:6279)在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1108) 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2393) 在 android.app.ActivityThread.handleLaunchActivity在 android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1362)(ActivityThread.java:2500) 在android.app.ActivityThread.access $ 900(ActivityThread.java:163) 一t android.os.Handler.dispatchMessage(Handler.java:102)at android.os.Looper.loop(Looper.java:148)at android.app.ActivityThread.main(ActivityThread.java:5585)at java .lang.reflect.Method.invoke(Native Method)at .android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:730) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java :620)

回答

0

您的權限設置是否正確? 您需要:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.WAKE_LOCK" /> 

參見:https://developer.android.com/guide/topics/media/mediaplayer.html#manifest

+0

我只用READ_EXTERNAL_STORAGE .. 但我已經加入其他兩個錯誤還是一樣。 –

+0

奇怪的是,您的代碼在我的設備上正常工作。 (Android 5.0)。試試這個: 'final MediaPlayer mp = MediaPlayer.create(this,Uri.parse(Environment.getExternalStorageDirectory()。getPath()+「...」));' 這樣就不需要調用prepare方法任何。你只需要調用'mp.start();'_after_ buffering完成! 希望它現在能工作。 – SirJavaGaming

+0

我試過了.. final MediaPlayer mp = MediaPlayer.create(this,Uri.parse(Environment.getExternalStorageDirectory()。getPath()+「/ New Folder/ztz_3_adding.mp3」)); 但我在.getPath遇到錯誤非法字符() 我的代碼工作正常,您的手機上?有點奇怪。 –