- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我希望相机在我更改为此记录器 Activity 时启动录像机,而不是在事件监听器上启动它。但是当我尝试在 oncreate 中运行它时,它会崩溃一次,然后它将按预期工作。
我在 MediaRecorder.start() 和 myCamera.unlock 上遇到错误。我该如何调试呢?
package com.abacus.surveillance;
import android.app.Activity;
import android.content.Intent;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
import java.io.IOException;
import android.app.Activity;
import android.content.Context;
import android.hardware.Camera;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Bundle;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.Toast;
import android.os.Handler;
public class RecordActivity extends AppCompatActivity {
private static Camera myCamera;
private MyCameraSurfaceView myCameraSurfaceView;
private MediaRecorder mediaRecorder;
Button myButton;
Button restore;
SurfaceHolder surfaceHolder;
boolean recording;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
recording = false;
setContentView(R.layout.activity_record);
//Get Camera for preview
myCamera = getCameraInstance();
if(myCamera == null){
Log.d("ON Create","Failed to get camera");
} else {
Log.d("ON Create","Got camera");
}
myCameraSurfaceView = new MyCameraSurfaceView(this, myCamera);
FrameLayout myCameraPreview = (FrameLayout)findViewById(R.id.videoview);
myCameraPreview.addView(myCameraSurfaceView);
myButton = (Button)findViewById(R.id.mybutton);
restore = (Button)findViewById(R.id.restorebtn);
myButton.setOnClickListener(myButtonOnClickListener);
restore.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(new Intent(RecordActivity.this, MainActivity.class));
}
});
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
startRecord();
}
}, 3000);
}
Button.OnClickListener myButtonOnClickListener
= new Button.OnClickListener(){
@Override
public void onClick(View v) {
startRecord();
}
};
private void startRecord(){
if(recording){
try{
mediaRecorder.stop();
releaseMediaRecorder();
//finish();
myButton.setText("REC");
}catch(Exception e){
e.printStackTrace();
}
}else{
releaseCamera();
if(!prepareMediaRecorder()){
Toast.makeText(RecordActivity.this,
"Fail in prepareMediaRecorder()!\n - Ended -",
Toast.LENGTH_LONG).show();
finish();
}
mediaRecorder.start();
Log.d("start", "started");
recording = true;
myButton.setText("STOP");
}
}
private Camera getCameraInstance(){
Camera c = null;
try {
c = Camera.open();
Log.d("open", "open");
}
catch (Exception e){
Log.d("notopen", "notopen");
Log.e("camera", e.getMessage());
}
return c;
}
private boolean prepareMediaRecorder(){
Log.d("prep", "prepcamera");
myCamera = getCameraInstance();
mediaRecorder = new MediaRecorder();
myCamera.unlock();
//myCamera.setDisplayOrientation(90);
mediaRecorder.setCamera(myCamera);
mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER);
mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_480P));
mediaRecorder.setOutputFile("/sdcard/myvideo.mp4");
mediaRecorder.setMaxDuration(60000);
mediaRecorder.setPreviewDisplay(myCameraSurfaceView.getHolder().getSurface());
try {
mediaRecorder.prepare();
Log.d("prepare", "prepared");
//mediaRecorder.start();
} catch (IllegalStateException e) {
Log.d("fail", "failed");
e.printStackTrace();
releaseMediaRecorder();
return false;
} catch (IOException e) {
Log.d("fail", "failed2");
e.printStackTrace();
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;
myCamera.lock();
}
}
private void releaseCamera(){
if (myCamera != null){
myCamera.release();
myCamera = null;
}
}
public class MyCameraSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
private SurfaceHolder mHolder;
private Camera mCamera;
public MyCameraSurfaceView(Context context, Camera camera) {
super(context);
mCamera = camera;
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int weight,
int height) {
if (mHolder.getSurface() == null){
return;
}
// stop preview before making changes
try {
mCamera.stopPreview();
} catch (Exception e){
// ignore: tried to stop a non-existent preview
}
try {
mCamera.setPreviewDisplay(mHolder);
mCamera.startPreview();
} catch (Exception e){
}
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
Log.d("prevfail","fail");
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
}
}
}
04-04 17:07:42.237 22448-22448/com.abacus.surveillance D/open: open
04-04 17:07:42.237 22448-22448/com.abacus.surveillance D/ON Create: Got camera
04-04 17:07:42.257 22448-22448/com.abacus.surveillance I/Choreographer: Skipped 42 frames! The application may be doing too much work on its main thread.
04-04 17:07:43.118 22448-22448/com.abacus.surveillance D/open: open
04-04 17:07:43.118 22448-22448/com.abacus.surveillance D/ON Create: Got camera
04-04 17:07:43.929 22448-22448/com.abacus.surveillance D/open: open
04-04 17:07:43.929 22448-22448/com.abacus.surveillance D/ON Create: Got camera
04-04 17:07:44.029 22448-22448/com.abacus.surveillance I/Choreographer: Skipped 96 frames! The application may be doing too much work on its main thread.
04-04 17:07:44.169 22448-22448/com.abacus.surveillance D/AndroidRuntime: Shutting down VM
04-04 17:07:44.169 22448-22448/com.abacus.surveillance W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x418ccda0)
04-04 17:07:44.199 22448-22448/com.abacus.surveillance E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.abacus.surveillance, PID: 22448
java.lang.RuntimeException: Method called after release()
at android.hardware.Camera.setPreviewDisplay(Native Method)
at android.hardware.Camera.setPreviewDisplay(Camera.java:530)
at com.abacus.surveillance.RecordActivity$MyCameraSurfaceView.surfaceCreated(RecordActivity.java:263)
at android.view.SurfaceView.updateWindow(SurfaceView.java:602)
at android.view.SurfaceView.access$000(SurfaceView.java:94)
at android.view.SurfaceView$3.onPreDraw(SurfaceView.java:183)
at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:891)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2193)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1251)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6540)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813)
at android.view.Choreographer.doCallbacks(Choreographer.java:613)
at android.view.Choreographer.doFrame(Choreographer.java:583)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
04-04 17:19:30.573 2479-2479/com.abacus.surveillance E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.abacus.surveillance, PID: 2479
java.lang.NullPointerException
at com.abacus.surveillance.RecordActivity.startRecord(RecordActivity.java:136)
at com.abacus.surveillance.RecordActivity.access$000(RecordActivity.java:40)
at com.abacus.surveillance.RecordActivity$2.run(RecordActivity.java:90)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
最佳答案
对于第一个异常,尝试更改 surfaceCreated()
像这样:
@Override
public void surfaceCreated(SurfaceHolder holder) {
if( mCamera != null ){
try {
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
} catch (IOException e) {
Log.d("prevfail","fail");
}
}
}
private void startRecord(){
if(recording){
try{
if( mediaRecorder != null )
mediaRecorder.stop();
releaseMediaRecorder();
//finish();
myButton.setText("REC");
}catch(Exception e){
e.printStackTrace();
}
}else{
releaseCamera();
if(!prepareMediaRecorder()){
Toast.makeText(RecordActivity.this,
"Fail in prepareMediaRecorder()!\n - Ended -",
Toast.LENGTH_LONG).show();
finish();
}
else{
mediaRecorder.start();
Log.d("start", "started");
recording = true;
myButton.setText("STOP");
}
}
}
关于java - Mediarecorder.start() 不会在 oncreate 上工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36405867/
我刚刚注意到 align-self 属性的一些值,这是我以前从未见过的。什么是start、end、self-start、self-end,它们与有什么区别>flex-start 和 flex-end?
我见过程序员使用公式 mid = start + (end - start) / 2 而不是使用更简单的公式 mid = (start + end) / 2 用于查找数组或列表中的中间元素。 为什么他
我们已经设置了一个小型 AZURE VM(由 Microsoft 提供的普通 Windows 2012 R2 镜像),其中包含一个轻量级 DEMO 应用程序,该应用程序可以与 SQLExpress 和
我在笔记本电脑上安装了Xampp 3.2.1版,之前MySQL在它上面运行得很好,但突然MySQL停止运行,而阿帕奇和其他公司都在运行。当我点击开始MySQL时,它显示这个错误我使用Windows 1
我希望我能解释清楚。 我有自动生成的代码,我希望用 CSS 覆盖它。 这是我希望覆盖的代码示例: #u1150:hover #u1153-4 p {color: red} 重要提示:此代码中的“u”将
在我的 package.json 中,我有以下脚本 block : "scripts": { "start": "react-scripts start",
https://github.com/lodash/lodash/blob/3.7.0/lodash.src.js#L2781 此代码段 start = start == null 中的 +start
上下文 我一直在阅读有关如何将 TUMBLINGWINDOW 函数与 TIMSTAMP BY 子句一起使用的文档,但似乎找不到有关如何计算包含 TUMBLING WINDOW 和 TIMESTAMP
我正在使用 Grunt 运行 Protractor 端到端测试用例。我有以下三个任务(我使用的是 windows 7 机器) webdriver-stop webdriver-start Protra
我正在创建一个简单的Java程序,它具有在窗口生成器的帮助下构建的GUI。 GUI只包含一个按钮。 单击按钮后,启动一个线程,该线程将无限次打印到随机数,直到再次单击同一按钮将其停止为止。 这是我的代
我一直在摆弄创建一个运行渲染的线程,并且我遇到了这种实现它的方法: Class Main implements Runnable { private Thread thread; private bo
我如何在 StartButton 类中编写一个 touchesBegun 命令,它在场景中调用 start() 任何实例本身? 我知道......可能是 OOP 101。但今天我远远超出了我的范围。
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 8年前关闭。 Improve this questi
我的目标是运行多个进程并保存它们的 ProcessName和 Id供以后使用。这是我的代码 [System.Collections.ArrayList]$startedProcesses = @()
我在 8086 汇编方面没有太多经验,我想知道如果您不写起始标签 (start:) 和该标签的结尾,程序会发生什么 (end start)(围绕执行代码的标签)? 所以我的问题是这个标签是否是执行所必
我在 8086 汇编方面没有太多经验,我想知道如果您不写起始标签 (start:) 和该标签的结尾,程序会发生什么 (end start)(围绕执行代码的标签)? 所以我的问题是这个标签是否是执行所必
我想在另一个脚本的 Start() 之前从一个脚本运行 Start()。是否可以?您可以选择脚本的执行顺序吗? 最佳答案 我不太确定 Start() 但您可以配置 Awake 的脚本执行顺序,OnEn
我有一个来自 Unity 文档页面的示例程序,其中包含 IEnumerator Start() ,如下所示,但我想知道如何才能拥有正常的 void Start() > 在同一个脚本中? 我也尝试添加v
正如标题所说,“从机启动”和“从机启动”有什么区别?当我接受DBA面试时,他问了这个问题,我搜索了google但没有找到答案,有人知道吗? 最佳答案 没有区别.. Slave start; 已弃用,现
我有几十个未记录的表,文档说未记录的表在崩溃或不正常关机后会自动截断。 基于此,我需要在数据库启动后检查一些表,看它们是否为“空”并采取一些措施。 简而言之,我需要在数据库启动后立即执行一个过程。 最
我是一名优秀的程序员,十分优秀!