媒体播放器android中的SetDataSource

媒体播放器android中的SetDataSource,android,Android,我有一门课是媒体播放器。我使用mp.setDataSource(path)从SD卡获取文件。但用这个方法我会出错。我如何改变设置播放机数据以使其工作的方式?我在读关于FileDescriptor的书。如何更改路径以使用FileDescriptor 这是一个错误: 07-16 15:42:00.827: W/System.err(616): java.io.IOException: setDataSourceFD failed.: status=0x80000000 07-16 15:42:00.

我有一门课是媒体播放器。我使用
mp.setDataSource(path)从SD卡获取文件。但用这个方法我会出错。我如何改变设置播放机数据以使其工作的方式?我在读关于FileDescriptor的书。如何更改路径以使用FileDescriptor

这是一个错误:

07-16 15:42:00.827: W/System.err(616): java.io.IOException: setDataSourceFD failed.: status=0x80000000
07-16 15:42:00.827: W/System.err(616):  at android.media.MediaPlayer.setDataSource(Native Method)
07-16 15:42:00.827: W/System.err(616):  at android.media.MediaPlayer.setDataSource(MediaPlayer.java:976)
07-16 15:42:00.827: W/System.err(616):  at VoiceRecorder$7.onClick(VoiceRecorder.java:306)
07-16 15:42:00.827: W/System.err(616):  at android.view.View.performClick(View.java:4202)
07-16 15:42:00.827: W/System.err(616):  at android.view.View$PerformClick.run(View.java:17341)
07-16 15:42:00.827: W/System.err(616):  at android.os.Handler.handleCallback(Handler.java:725)
07-16 15:42:00.827: W/System.err(616):  at android.os.Handler.dispatchMessage(Handler.java:92)
07-16 15:42:00.827: W/System.err(616):  at android.os.Looper.loop(Looper.java:137)
07-16 15:42:00.827: W/System.err(616):  at android.app.ActivityThread.main(ActivityThread.java:5039)
07-16 15:42:00.827: W/System.err(616):  at java.lang.reflect.Method.invokeNative(Native Method)
07-16 15:42:00.827: W/System.err(616):  at java.lang.reflect.Method.invoke(Method.java:511)
07-16 15:42:00.827: W/System.err(616):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-16 15:42:00.837: W/System.err(616):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-16 15:42:00.837: W/System.err(616):  at dalvik.system.NativeStart.main(Native Method)
07-16 15:42:00.857: W/MessageQueue(616): Handler (android.media.MediaRecorder$EventHandler) {416bcf68} sending message to a Handler on a dead thread
07-16 15:42:00.857: W/MessageQueue(616): java.lang.RuntimeException: Handler (android.media.MediaRecorder$EventHandler) {416bcf68} sending message to a Handler on a dead thread
07-16 15:42:00.857: W/MessageQueue(616):    at android.os.MessageQueue.enqueueMessage(MessageQueue.java:294)
07-16 15:42:00.857: W/MessageQueue(616):    at android.os.Handler.enqueueMessage(Handler.java:618)
07-16 15:42:00.857: W/MessageQueue(616):    at android.os.Handler.sendMessageAtTime(Handler.java:587)
07-16 15:42:00.857: W/MessageQueue(616):    at android.os.Handler.sendMessageDelayed(Handler.java:558)
07-16 15:42:00.857: W/MessageQueue(616):    at android.os.Handler.sendMessage(Handler.java:495)
07-16 15:42:00.857: W/MessageQueue(616):    at android.media.MediaRecorder.postEventFromNative(MediaRecorder.java:977)
07-16 15:42:00.857: W/MessageQueue(616):    at dalvik.system.NativeStart.run(Native Method)
例如:

try {
    FileDescriptor fd = null;

    if (isInInternalMemory(audioFilename)) {
        int audioResourceId = mContext.getResources().getIdentifier(audioFilename, "raw", "com.ampirik.audio");
        AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(audioResourceId);
        fd = afd.getFileDescriptor();
    } else if (isInSdCard(audioFilename)) {
        File baseDir = Environment.getExternalStorageDirectory();
        String audioPath = baseDir.getAbsolutePath() + audioFilename + ".mp3";
        FileInputStream fis = new FileInputStream(audioPath);
        fd = fis.getFD();
    }

    if (fd != null) {
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setDataSource(fd);
        mediaPlayer.prepare();
        mediaPlayer.start();
    }
} catch (Exception e) {
    e.printStackTrace();
}
此示例来自另一个具有相同问题的示例。

示例:

try {
    FileDescriptor fd = null;

    if (isInInternalMemory(audioFilename)) {
        int audioResourceId = mContext.getResources().getIdentifier(audioFilename, "raw", "com.ampirik.audio");
        AssetFileDescriptor afd = mContext.getResources().openRawResourceFd(audioResourceId);
        fd = afd.getFileDescriptor();
    } else if (isInSdCard(audioFilename)) {
        File baseDir = Environment.getExternalStorageDirectory();
        String audioPath = baseDir.getAbsolutePath() + audioFilename + ".mp3";
        FileInputStream fis = new FileInputStream(audioPath);
        fd = fis.getFD();
    }

    if (fd != null) {
        MediaPlayer mediaPlayer = new MediaPlayer();
        mediaPlayer.setDataSource(fd);
        mediaPlayer.prepare();
        mediaPlayer.start();
    }
} catch (Exception e) {
    e.printStackTrace();
}

此示例来自另一个具有相同问题的示例。

要从SD卡播放视频文件,您也可以使用以下示例:

    VideoView videoView = (VideoView) findViewById(R.id.videoView1);

    String sdcardPath = "/sdcard/smaple.mp4"
    videoView.setVideoPath(sdcardPath);

    /** These one is controlling mediaplayer  */

    MediaController mediaControler = new MediaController(this);
    mediaControler.setAnchorView(videoView);
    videoView.setMediaController(mediaControler);
    videoView.requestFocus();
    videoView.start();
SD卡格式从DDMS/FileExplorer/SD卡/视频获取


必须记住:仅支持.mp4和3gp视频格式的视频视图

要从SD卡播放视频文件您也可以使用以下格式:

    VideoView videoView = (VideoView) findViewById(R.id.videoView1);

    String sdcardPath = "/sdcard/smaple.mp4"
    videoView.setVideoPath(sdcardPath);

    /** These one is controlling mediaplayer  */

    MediaController mediaControler = new MediaController(this);
    mediaControler.setAnchorView(videoView);
    videoView.setMediaController(mediaControler);
    videoView.requestFocus();
    videoView.start();
SD卡格式从DDMS/FileExplorer/SD卡/视频获取


必须记住:仅支持.mp4和3gp视频格式的VideoView

不要忘记在项目AndroidManifest.xml中添加android.permission.READ_外部_存储

不要忘记在项目AndroidManifest.xml中添加android.permission.READ_外部_存储

您到底遇到了什么错误?你的代码看起来像什么?它是什么类型的文件?您必须明确设置文件的长度。使用重载方法:AssetFileDescriptor afd=ctx.getAssets().openFd([您的资产名称]);setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());你到底犯了什么错误?你的代码看起来像什么?它是什么类型的文件?您必须明确设置文件的长度。使用重载方法:AssetFileDescriptor afd=ctx.getAssets().openFd([您的资产名称]);setDataSource(afd.getFileDescriptor(),afd.getStartOffset(),afd.getLength());