视频视频可以播放存储在内部存储中的视频吗?

she*_*man 19 android internal android-videoview

我正在尝试为我的用户提供使用外部或内部存储的能力.我正在显示图像和视频(科学性质).将媒体存储在SD卡上时,一切都很好.但是当我在内部存储媒体时,只会显示图像.无论我尝试什么,我在尝试加载和显示存储在applicationcontext.getFilesDir()下的媒体时都会遇到各种错误.

是否有将视频内容设置为此类文件的技巧?

ContentResolver可以帮助我吗?

在相关的说明中,假设存在外部存储是否被视为不良形式?

提前致谢,

希德

下面是一个失败的版本"无法播放视频.抱歉,此视频无法播放".但我有许多其他失败模式.我可以将内部视频复制到临时存储(外部)并播放它,因此这个复制到内部确实创建了一个有效的电影.它只在我尝试直接从内部存储器播放时失败.

videoFile = new File(this.getFilesDir() + File.separator + "test.mp4");


InputStream data = res.openRawResource(R.raw.moviegood);


try {
    OutputStream myOutputStream = new FileOutputStream(videoFile);


    byte[] buffer = new byte[8192];
    int length;
    while ( (length = data.read(buffer)) > 0 ) {
        myOutputStream.write(buffer);
    }

    //Close the streams
    myOutputStream.flush();
    myOutputStream.close();
    data.close();
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}




vview.setKeepScreenOn(true);
vview.setVideoPath(videoFile.getAbsolutePath());
vview.start();
Run Code Online (Sandbox Code Playgroud)

gtk*_*oid 25

MediaPlayer要求正在播放的文件具有世界可读的权限.您可以在adb shell中使用以下命令查看文件的权限:

ls -al /data/data/com.mypackage/myfile
Run Code Online (Sandbox Code Playgroud)

您可能会看到"-rw ------",这意味着只有所有者(您的应用程序,而不是MediaPlayer)具有读/写权限.

注意:您的手机必须是root用户才能使用ls命令而不指定文件(在内部存储器中).

如果您的手机是root用户,则可以使用以下命令在adb shell中添加全局读取权限:

chmod o+r /data/data/com.mypackage/myfile
Run Code Online (Sandbox Code Playgroud)

如果您需要以编程方式修改这些权限(需要rooted phone!),您可以在应用代码中使用以下命令:

Runtime.getRuntime().exec("chmod o+r /data/data/com.mypackage/myfile");
Run Code Online (Sandbox Code Playgroud)

这基本上是一个linux命令.有关chmod的更多信息,请参阅https://help.ubuntu.com/community/FilePermissions.

编辑:在这里找到另一个简单的方法(对没有root电话的人有用).由于应用程序拥有该文件,因此它可以创建文件描述符并将其传递给mediaPlayer.setDataSource():

FileInputStream fileInputStream = new FileInputStream("/data/data/com.mypackage/myfile");
mediaPlayer.setDataSource(fileInputStream.getFD());
Run Code Online (Sandbox Code Playgroud)

这种方法完全避免了许可问题.