2012-02-23 235 views
0

在我的应用程序中,我获得了外部存在的音频文件列表,并使用该文件的Uri播放第一个文件。我为它编写了下面的代码。使用Uri通过媒体播放器播放音频剪辑

public class ScrSettings extends Activity{ 
private Uri uriString; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test); 

    Button playsong = (Button) findViewById(R.id.show_me); 
    playsong.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      uriString = getFirstSongUri(); 
      Log.i("Uri is : ", uriString.toString()); 

      MediaPlayer mp = new MediaPlayer(); 
      try { 
       mp.setDataSource(ScrSettings.this, uriString); 
       mp.prepare(); 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      mp.start(); 
     } 
    }); 
} 
private Uri getFirstSongUri() { 
    Cursor media = null; 
    String songTitle = ""; 
    try { 
     // query for the numbers associated with the contact 
     media = getContentResolver().query(Media.EXTERNAL_CONTENT_URI, 
       null, null, null, null); 

     while (media.moveToNext()) { 
      songTitle = media.getString(media.getColumnIndex(Media.DISPLAY_NAME)); 
      Uri uri = Media.getContentUri(songTitle); 
      return uri; 
     } 
    } catch (Exception e) { 
     Log.e("MediaList", "Failed to get email data", e); 
    } finally { 
     if (media != null) { 
      media.close(); 
     } 
    } 
    return null; 
} 
} 

而且它还会在logcat中记录歌曲的Uri,但它不会播放该文件,并且出现以下异常。

02-23 16:06:19.038: W/System.err(1890): java.io.IOException: setDataSource failed.: status=0x80000000 
02-23 16:06:19.058: W/System.err(1890):  at android.media.MediaPlayer.setDataSource(Native Method) 
02-23 16:06:19.058: W/System.err(1890):  at android.media.MediaPlayer.setDataSource(MediaPlayer.java:800) 
02-23 16:06:19.058: W/System.err(1890):  at android.media.MediaPlayer.setDataSource(MediaPlayer.java:725) 
02-23 16:06:19.058: W/System.err(1890):  at com.raj.poc.test.ScrSettings$1.onClick(ScrSettings.java:51) 
02-23 16:06:19.058: W/System.err(1890):  at android.view.View.performClick(View.java:2532) 
02-23 16:06:19.058: W/System.err(1890):  at android.view.View$PerformClick.run(View.java:9293) 
02-23 16:06:19.058: W/System.err(1890):  at android.os.Handler.handleCallback(Handler.java:587) 
02-23 16:06:19.058: W/System.err(1890):  at android.os.Handler.dispatchMessage(Handler.java:92) 
02-23 16:06:19.058: W/System.err(1890):  at android.os.Looper.loop(Looper.java:150) 
02-23 16:06:19.058: W/System.err(1890):  at android.app.ActivityThread.main(ActivityThread.java:4277) 
02-23 16:06:19.058: W/System.err(1890):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-23 16:06:19.058: W/System.err(1890):  at java.lang.reflect.Method.invoke(Method.java:507) 
02-23 16:06:19.058: W/System.err(1890):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
02-23 16:06:19.068: W/System.err(1890):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
02-23 16:06:19.068: W/System.err(1890):  at dalvik.system.NativeStart.main(Native Method) 

有谁可以请告诉我我哪里错了?

回答

0

我想我只是在setDataSource失败时有相同的错误状态,这意味着媒体文件的格式不被MediaPlayer理解。

0

你必须使用MediaStore.Audio音频...

media .getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.AudioColumns.TITLE)); 

也有look here