我一直在尝试创建一个记录视频并将视频上传到S3存储桶的应用。 我一直在使用(稍微改变一下)Android capture video intent article。但是当录音结束时,我会得到一个错误列表。 (我正在使用Galaxy S2手机,所以支持它。)
CameraActivity代码:
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
fileUri = SavingMedia
.getOutputMediaFileUri(SavingMedia.MEDIA_TYPE_VIDEO);
path = fileUri.toString();
intent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 30);
intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
intent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0.2);
startActivityForResult(intent, CAPTURE_VIDEO_REQUEST_CODE);
LogCat输出:
05-08 10:46:31.875: E/CameraInput(2595): Recording is not ready (iPeer 0xfbb3c iState 2 iWriteState 1 iClockState 0), frame dropped
05-08 10:46:31.910: E/CameraInput(2595): Recording is not ready (iPeer 0xfbb3c iState 2 iWriteState 1 iClockState 0), frame dropped
05-08 10:46:31.945: E/CameraInput(2595): Recording is not ready (iPeer 0xfbb3c iState 2 iWriteState 1 iClockState 0), frame dropped
05-08 10:46:31.975: E/CameraInput(2595): Recording is not ready (iPeer 0xfbb3c iState 2 iWriteState 1 iClockState 0), frame dropped
05-08 10:46:33.455: E/yamaha::media::Parameters(2595): SalesCode = PTR
05-08 10:46:33.705: E/CameraInput(2595): Unsupported parameter(x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value)
05-08 10:46:33.705: E/CameraInput(2595): VerifiyAndSetParameter failed on parameter #0
05-08 10:46:33.705: E/audio_input(2595): unsupported parameter: x-pvmf/media-input-node/cap-config-interface;valtype=key_specific_value
05-08 10:46:33.705: E/audio_input(2595): VerifyAndSetParameter failed
05-08 10:46:33.740: E/AndroidRuntime(29786): FATAL EXCEPTION: main
05-08 10:46:33.740: E/AndroidRuntime(29786): java.lang.NullPointerException
05-08 10:46:33.740: E/AndroidRuntime(29786): at java.io.File.fixSlashes(File.java:205)
05-08 10:46:33.740: E/AndroidRuntime(29786): at java.io.File.init(File.java:189)
05-08 10:46:33.740: E/AndroidRuntime(29786): at java.io.File.<init>(File.java:139)
05-08 10:46:33.740: E/AndroidRuntime(29786): at com.sec.android.app.camera.CamcorderEngine.renameTempFile(CamcorderEngine.java:1206)
05-08 10:46:33.740: E/AndroidRuntime(29786): at com.sec.android.app.camera.CamcorderEngine.doStopVideoRecordingSync(CamcorderEngine.java:812)
05-08 10:46:33.740: E/AndroidRuntime(29786): at com.sec.android.app.camera.CeStateRecording.handleRequest(CeStateRecording.java:69)
05-08 10:46:33.740: E/AndroidRuntime(29786): at com.sec.android.app.camera.CeRequestQueue.startFirstRequest(CeRequestQueue.java:123)
05-08 10:46:33.740: E/AndroidRuntime(29786): at com.sec.android.app.camera.CeRequestQueue.access$200(CeRequestQueue.java:32)
05-08 10:46:33.740: E/AndroidRuntime(29786): at com.sec.android.app.camera.CeRequestQueue$MainHandler.handleMessage(CeRequestQueue.java:60)
05-08 10:46:33.740: E/AndroidRuntime(29786): at android.os.Handler.dispatchMessage(Handler.java:99)
05-08 10:46:33.740: E/AndroidRuntime(29786): at android.os.Looper.loop(Looper.java:123)
05-08 10:46:33.740: E/AndroidRuntime(29786): at android.app.ActivityThread.main(ActivityThread.java:3691)
05-08 10:46:33.740: E/AndroidRuntime(29786): at java.lang.reflect.Method.invokeNative(Native Method)
05-08 10:46:33.740: E/AndroidRuntime(29786): at java.lang.reflect.Method.invoke(Method.java:507)
05-08 10:46:33.740: E/AndroidRuntime(29786): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
05-08 10:46:33.740: E/AndroidRuntime(29786): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
05-08 10:46:33.740: E/AndroidRuntime(29786): at dalvik.system.NativeStart.main(Native Method)
05-08 10:46:33.770: E/(2806): Dumpstate > /data/log/dumpstate_app_error
答案 0 :(得分:2)
好友你应该看到以下问题的答案, 它对我有用,绝对适合你。
Android: Video Recording Throws Error
注意:我有如下错误
at com.sec.android.app.camera.CamcorderEngine.renameTempFile(CamcorderEngine.java:1206)
解决方案:在Android 2.2,2.3中工作 ... 我已经完成了以下捕捉照片的过程
int CAMERA_WITH_VIDEO_DATA = 2;
//start photo capture activity...
Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE, null);
startActivityForResult(intent, CAMERA_WITH_VIDEO_DATA);
....
....
private void saveVideoFileOnActivityResult(Intent videoIntent){
FileInputStream fis = null;
FileOutputStream fos = null;
File mCurrentVideoFile = null;
try {
mCurrentVideoFile = new File("path_to_your_file");
AssetFileDescriptor videoAsset = getContentResolver().openAssetFileDescriptor(videoIntent.getData(), "r");
fis = videoAsset.createInputStream();
//File videoFile = new File(Environment.getExternalStorageDirectory(),"<VideoFileName>.mp4");
fos = new FileOutputStream(mCurrentVideoFile);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
//fis.close();
//fos.close();
} catch (IOException e) {
// TODO: handle error
e.printStackTrace();
}finally{
try {
if(fis!=null)
fis.close();
if(fos!=null)
fos.close();
} catch (Exception e2) {
// TODO: handle exception
e2.printStackTrace();
}
}
}
....
....
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case CAMERA_WITH_VIDEO_DATA:
//pass data to above method to save it.
saveVideoFileOnActivityResult(data);
break;
default:
break;
}
}
答案 1 :(得分:0)
好的,我改进了Logcat以查看错误的开始位置,以及程序失败的第一行:
05-08 10:46:33.740: E/AndroidRuntime(29786): at com.sec.android.app.camera.CamcorderEngine.renameTempFile(CamcorderEngine.java:1206)
Google快速搜索将我带到了this place,显然MediaStore.EXTRA_OUTPUT
没有正常工作且存在问题。
这就是那里写的答案:
实际上,我发现在某些情况下MediaStore.EXTRA_OUTPUT无法正常工作,所以另一种技巧方式是,将捕获的视频文件存储在onActivityResult()
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onActivityResult(requestCode, resultCode, intent);
if (resultCode == RESULT_OK) {
try {
AssetFileDescriptor videoAsset = getContentResolver().openAssetFileDescriptor(intent.getData(), "r");
FileInputStream fis = videoAsset.createInputStream();
File videoFile = new File(Environment.getExternalStorageDirectory(),"<VideoFileName>.mp4");
FileOutputStream fos = new FileOutputStream(videoFile);
byte[] buffer = new byte[1024];
int length;
while ((length = fis.read(buffer)) > 0) {
fos.write(buffer, 0, length);
}
fis.close();
fos.close();
} catch (IOException e) {
// TODO: handle error
}
}
}