エラーが発生すると、エラー-2147483648は不明なエラーを示します。これはビデオエンコーディングと関係がありますが、ファイルパスが存在することを確認する価値があります。、VideoViewはそれを読み取る権限を持っています。
私の問題は、ファイルをContext.MODE_PRIVATE(デフォルト)で書いていたことでした。
openFileOutput(filename, Context.MODE_PRIVATE);
これは、アプリケーションのみがファイルにアクセスできることを示します。特定の方法や理由はわかりませんが、Jelly Bean以上では、ビデオビューで指定したファイルにアプリケーションのようにアクセスできますが、Jelly Beanの前には、ビデオビューでファイルを自分のコンテキスト(アプリケーションのものではない)に保存します。モードはプライベートなので、失敗します。
解決策の1つは、Context.MODE_WORLD_READABLEでファイルを書き込むことです。現在は廃止予定です。これは誰でもそのパスでファイルを開くことができることを示します。これは明らかに危険であり、落胆しています。
このケースを処理するためにコンテンツプロバイダと独自のURIを作成しました。具体的に:
AndroidManfest.xml:
...
<provider
android:name="com.myexampleapp.video.VideoProvider"
android:authorities="com.myexampleapp.video.VideoProvider.files"
android:exported="false" />
</application>
</manifest>
VideoProvider.java:
package com.myexampleapp.video;
import java.io.File;
import java.io.FileNotFoundException;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.ParcelFileDescriptor;
public class VideoProvider extends ContentProvider {
public static final Uri CONTENT_URI_BASE =
Uri.parse("content://com.myexampleapp.video.VideoProvider.files.files/");
private static final String VIDEO_MIME_TYPE = "video/mp4";
@Override
public boolean onCreate() {
return true;
}
@Override
public String getType(final Uri uri) {
return VIDEO_MIME_TYPE;
}
@Override
public ParcelFileDescriptor openFile(final Uri uri, final String mode)
throws FileNotFoundException {
File f = new File(uri.getPath());
if (f.exists())
return (ParcelFileDescriptor.open(f,
ParcelFileDescriptor.MODE_READ_ONLY));
throw new FileNotFoundException(uri.getPath());
}
@Override
public int delete(final Uri uri, final String selection, final String[] selectionArgs) {
throw new UnsupportedOperationException();
}
@Override
public Uri insert(final Uri uri, final ContentValues values) {
throw new UnsupportedOperationException();
}
@Override
public Cursor query(final Uri uri, final String[] projection, final String selection, final String[] selectionArgs, final String sortOrder) {
throw new UnsupportedOperationException();
}
@Override
public int update(final Uri uri, final ContentValues values, final String selection, final String[] selectionArgs) {
throw new UnsupportedOperationException();
}
}
そして、私は私のビデオファイルにアクセスします。
VideoView myVideoView = findViewById(R.id.videoView);
...
myVideoView.setVideoURI(
Uri.parse(
CachedActionProvider.CONTENT_URI_BASE + Uri.encode(videoFilename)));
...
myVideoView.start();
この本物ですあなたのContentProviderにファイル記述子のデータを要求するようVideoViewに伝えています。ファイル記述子は許可されていないため、アプリケーションのアクセス権を使用してファイルを開き、VideoViewに独自のアクセス権を使用してファイルを開くように要求するのではなく、VideoViewに渡します。
これは私の問題とうまくいけばあなたのものも修正します!
を助けることができる、私はアンドロイドのバージョン4.1でよく果たしているview.Itビデオでビデオを再生するにはあなたのソリューションを試してみましたが、私はエミュレータでこれを実行すると私は同じエラーを取得しています'エラー(1、-2147483648)。 .3gpと.mp4ビデオを試しましたが、エミュレータで同じエラーが表示されます。この問題を解決するにはどうすればいいですか、私を案内してください。このエラーは本当にあいまいです。私は今何をすべきかを知りません。 – Dory
エミュレータはどのバージョンを実行していますか? – spitzanator
私はバージョン2.3でも4.0でも試しました – Dory