Android MediaPlayer full path to file

烈酒焚心 提交于 2019-12-03 00:50:28

The second call to MediaPlayer.prepare() (already called once in the AudioVideoEntry ctor) in the AudioVideoEntry.prepareMedia() method was easy to spot as other people have noticed.

The harder error to find was the first error.

I used an Ogg file for testing.

First clue was from davidsparks reply (last one) in android-platform - Ogg on G1

As long as the files have a .ogg extension, they should play with the built-in music player. We rely on the file extensions because there is no centralized file recognizer for the media scanner.

Second clue was from [android-developers] Re: File permission about MediaPlayer

Due to the Android security model, MediaPlayer does not have root access rights. It can access the sdcard, but it can't access private app directories.

Your app can explicitly grant MediaPlayer temporary access to secure files by opening the file and passing the file descriptor to MediaPlayer using the setDataSource(FileDescriptor fd) method.

If you look at the absolute path of the output stream, you see it's in the /data/data directory under the app's package name's directory.

Excuse the timestamps - I worked backwards to get data to show on a OS2.1update1 (API7) emulator.

Your code had:

String ave_file_name = "my_media_content";

ave_fos = activity.openFileOutput(ave_file_name, Context.MODE_PRIVATE);

DDMS showed:

02-10 05:10:28.253: WARN/MediaPlayer(1992): info/warning (1, 26)
02-10 05:10:28.253: ERROR/PlayerDriver(31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
02-10 05:10:28.253: ERROR/MediaPlayer(1992): error (1, -4)
02-10 05:10:28.274: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete

If we change JUST the file to MODE_WORLD_READABLE:

String ave_file_name = "my_media_content";

ave_fos = activity.openFileOutput(ave_file_name, Context.MODE_WORLD_READABLE);

DDMS shows no improvement:

02-10 05:08:28.543: WARN/MediaPlayer(1900): info/warning (1, 26)
02-10 05:08:28.553: ERROR/PlayerDriver(31): Command PLAYER_SET_DATA_SOURCE completed with an error or info PVMFErrNotSupported
02-10 05:08:28.553: ERROR/MediaPlayer(1900): error (1, -4)
02-10 05:08:28.563: WARN/PlayerDriver(31): PVMFInfoErrorHandlingComplete

If we change JUST the file extension to ogg:

String ave_file_name = "my_media_content.ogg";

ave_fos = activity.openFileOutput(ave_file_name, Context.MODE_PRIVATE);

We get a change in DDMS output:

02-10 04:59:30.153: ERROR/MediaPlayerService(31):   error: -2
02-10 04:59:30.163: ERROR/MediaPlayer(1603): Unable to to create media player

But when we combine the two:

String ave_file_name = "my_media_content.ogg";

ave_fos = activity.openFileOutput(ave_file_name, Context.MODE_WORLD_READABLE);

DDMS shows no errors.

Some points:

  1. Do not call prepare() twice (once in the constructor and the other explicitly). That could be one of the reasons that the IllegalStateException is thrown.
  2. Also, is the file that you are trying to play inside the application? If so, why are you trying to create a stream? If the file is already within the application (and within /res/raw, you could try and save yourself the hassle of using prepare() by creating the mediaplayer object like so:

    mediaplayer = new MediaPlayer.create(this, R.raw.resource-name here);

The create function calls prepare() within.
3. You can also try and use the reset() function if any one of the stages in the MediaPlayer fails resulting in the MediaPlayer object entering the error state. Using reset() would bring it back to Idle state.
4. The last time I had that error status=0x1 message, it turned out that I had not had the correct permissions set for the files (external storage etc. in Manifest) and some files placed in incorrect folders. You may also want to take a look at that.

Let me know in case that does not work,
We can try something else.
Sriram.

It seems you are calling prepare() twice, first in the constructor of AudioVideoEntry, and second in the method prepareMedia(), that's why it's giving an IllegalStateException.

If you read carefully the documentation you can understand the State Diagram and why gives such exceptions.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!