问题描述
我正在开发一个相机应用,它使用 Camera API
、FrameLayout
和 MediaRecorder
类更改相机的某些参数。我的主要目标是更改我将要在此应用上录制的视频的 frame per second
(fps) 和 resolution
。为此,我按照 Android 网站 Camera API 部分的说明操作,并添加了我的项目所需的功能。
代码如下:
public class MainActivity extends AppCompatActivity {
private Camera mCamera;
private Button captureButton;
private CameraPreview cameraPreview;
private FrameLayout preview;
private MediaRecorder mediaRecorder;
private boolean isRecording = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mCamera = getCameraInstance();
cameraPreview = new CameraPreview(this,mCamera);
preview = (FrameLayout) findViewById(R.id.camera_previewXML);
preview.addView(cameraPreview);
captureButton = (Button) findViewById(R.id.capture_buttonXML);
captureButton.setonClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isRecording) {
mediaRecorder.stop();
releaseMediaRecorder();
mCamera.lock();
isRecording = false;
} else {
if(prepareVideoRecorder()) {
mediaRecorder.start();
isRecording = true;
} else {
releaseMediaRecorder();
}
}
}
});
}
public static Camera getCameraInstance(){
Camera c = null;
try{
c = Camera.open();
} catch (Exception e){
} return c;
}
private boolean prepareVideoRecorder(){
mCamera = getCameraInstance();
mediaRecorder = new MediaRecorder();
mCamera.unlock();
mediaRecorder.setCamera(mCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setoutputFormat(MediaRecorder.OutputFormat.MPEG_4);
mediaRecorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
mediaRecorder.setVideoEncodingBitRate(10000000);
mediaRecorder.setVideoFrameRate(30);
mediaRecorder.setVideoSize(1280,720);
mediaRecorder.setoutputFile(getoutputMediaFile(MEDIA_TYPE_VIDEO).toString());
mediaRecorder.setPreviewdisplay(cameraPreview.getHolder().getSurface());
try{
mediaRecorder.prepare();
} catch (IllegalStateException e){
Log.d(TAG,"IllegalStateException ao prepara o MediaRecorder"+e.getMessage());
releaseMediaRecorder();
return false;
} catch (IOException e){
Log.d(TAG,"IOException preparando o MediaRecorder"+e.getMessage());
releaseMediaRecorder();
return false;
}
return true;
}
@Override
protected void onPause(){
super.onPause();
releaseMediaRecorder();
releaseCamera();
}
private void releaseMediaRecorder(){
if(mediaRecorder != null){
mediaRecorder.reset();
mediaRecorder.release();
mediaRecorder = null;
mCamera.lock();
}
}
private void releaseCamera(){
if(mCamera != null){
mCamera.release();
mCamera = null;
}
}
public static final int MEDIA_TYPE_VIDEO = 2;
private static File getoutputMediaFile(int type){
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES),"MyCameraApp");
if( ! mediaStorageDir.exists()){
if(! mediaStorageDir.mkdirs()){
Log.d("MyCameraApp","Falha na criação do diretório");
return null;
}
}
String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
File mediaFile;
if(type == MEDIA_TYPE_VIDEO){
mediaFile = new File(mediaStorageDir.getPath() + File.separator +
"VID_" + timeStamp + ".mp4");
} else {
return null;
}
return mediaFile;
}
}
当我在智能手机上执行它时,出现此错误:
´´´
Process: com.example.myapplication,PID: 29541
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String
java.io.File.toString()' on a null object reference
at com.example.myapplication.MainActivity.prepareVideoRecorder(MainActivity.java:95)
at com.example.myapplication.MainActivity.access$400(MainActivity.java:22)
at com.example.myapplication.MainActivity$1.onClick(MainActivity.java:55)
at android.view.View.performClick(View.java:7161)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
at android.view.View.performClickInternal(View.java:7133)
at android.view.View.access$3500(View.java:804)
at android.view.View$PerformClick.run(View.java:27416)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:241)
at android.app.ActivityThread.main(ActivityThread.java:7604)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:941)
´´´
显然,当我调用方法 toString()
来保存我创建的文件时,我试图调用方法 setoutputFile()
。但是,当我按下按钮来捕获视频时,它显示错误
Attempt to invoke virtual method 'java.lang.String
java.io.File.toString()' on a null object reference
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)