要让MediaPlayer / VideoView能够播放视频文件,在将其保存到内部存储空间时,我们必须使用MODE_WORLD_READABLE
进行保存,这样可以公开显示该设备。
如果我们将MODE_PRIVATE
保存到私人内部存储空间,则无法播放。
我在播放文件之前尝试使用file.setReadable(true,false)解决这个问题,但是没有用。
我尝试在播放前将文件从内部存储器复制到外部存储器(之后从外部存储器中删除),但由于未知原因无法播放该文件。
如果我将视频文件保存到外部存储器,没有问题,但我有一个规格将视频文件保存到内部。
那么,如果使用MODE_PRIVATE将视频文件保存到内部存储器,如何使用VideoView播放视频文件?
...
ctx.openFileOutput(filename, Context.MODE_PRIVATE);
...
编辑:我尝试过FileProvider,但结果是一样的:
06-17 18:44:55.707: E/playVideo(14626): playVideo
06-17 18:44:55.758: E/MediaPlayer(14626): error (1, -2147483648)
06-17 18:44:55.783: E/MediaPlayer(14626): Error (1,-2147483648)
06-17 18:44:55.788: D/VideoView(14626): Error: 1,-2147483648
编辑:
这是我目前的内容提供商。 我应该更改它以及如何使用它来为此视频授予权限:
public class ContentProviderDB extends ContentProvider { //
DatabaseManager dbHelper;
public static final String AUTHORITY = "ourContentProviderAuthorities";// specific for our our app, will be specified in manifest
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY);
@Override
public boolean onCreate() {
dbHelper = new DatabaseManager(getContext());
return true;
}
@Override
public int delete(Uri uri, String where, String[] args) {
String table = getTableName(uri);
SQLiteDatabase dataBase = dbHelper.getWritableDatabase();
return dataBase.delete(table, where, args);
}
@Override
public String getType(Uri arg0) {
return null;
}
@Override
public Uri insert(Uri uri, ContentValues initialValues) {
String table = getTableName(uri);
SQLiteDatabase database = dbHelper.getWritableDatabase();
long value = database.insert(table, null, initialValues);
return Uri.withAppendedPath(CONTENT_URI, String.valueOf(value));
}
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
String table = getTableName(uri);
SQLiteDatabase database = dbHelper.getReadableDatabase();
Cursor cursor = database.query(table, projection, selection, selectionArgs, null, null, sortOrder);
return cursor;
}
@Override
public int update(Uri uri, ContentValues values, String whereClause, String[] whereArgs) {
String table = getTableName(uri);
SQLiteDatabase database = dbHelper.getWritableDatabase();
return database.update(table, values, whereClause, whereArgs);
}
public static String getTableName(Uri uri) {
String value = uri.getPath();
value = value.replace("/", "");// we need to remove '/'
return value;
}
}
在Manifest中:
<provider
android:name="com.example.asd.database.hq.ContentProviderDB"
android:authorities="ourContentProviderAuthorities" >
</provider>
编辑:尝试使用FileContentProvider,如下所示:
https://github.com/commonsguy/cw-omnibus/tree/master/ContentProvider/Files
编辑:试用自定义VideoView实现:https://code.google.com/p/android/issues/attachmentText?id=10197&aid=101970011000&name=VideoView.java&token=ABZ6GAelZgxrshWGWQmdsiltNpqJm9Xpnw%3A1434560893561接受FileDescriptor,如下所述: https://stackoverflow.com/a/5475436/2576903
这些解决方案都没有产生任何不同的结果