我正在尝试创建一个非常简单的应用程序,只显示相机在屏幕上查看的内容。我用一个模拟器(与我使用的手机相同的规格)创建了应用程序,它显示了黑色和白色的方形背景,灰色的查看框在它上面移动,所以我很确定我的所有代码和权限都是正确的。 / p>
当我尝试在我的Wildfire手机上运行应用程序(Android版本:2.2.1)时,在显示任何内容之前强制关闭,当我检查日志时会显示此错误。
我查看了一些网站,看起来它可能是操作系统或硬件的问题。有人找到了解决方法吗?
我将发布我的代码以防我犯了一个愚蠢的错误。
import android.app.Activity;
import android.content.pm.ActivityInfo;
import android.os.Bundle;
public class InformationPassingTestActivity extends Activity {
Preview preview;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
preview = new Preview(this);
setContentView(preview);
}
}
我处理相机的预览类
class Preview extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
public Camera camera;
Preview(Context context) {
super(context);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
camera = Camera.open();
try {
camera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
}
public void surfaceDestroyed(SurfaceHolder holder) {
camera.stopPreview();
camera = null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
Camera.Parameters parameters = camera.getParameters();
parameters.setPreviewSize(width, height);
camera.setParameters(parameters);
camera.startPreview();
}
}
的Manifest.xml
<uses-permission android:name="android.permission.CAMERA" />
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-sdk android:minSdkVersion="8" />
<application android:icon="@drawable/ic_launcher" android:label="@string/app_name" >
<activity android:label="@string/app_name" android:name=".InformationPassingTestActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
任何帮助都会令人惊讶:)
答案 0 :(得分:3)
您的问题可能来自此行(或者如果它还没有):parameters.setPreviewSize(width, height);
实际相机无法支持每种预览尺寸。您需要选择一个接近表面大小并由相机硬件支持的预览尺寸。以下是一种示例方法:
private Camera.Size getBestPreviewSize(int width, int height,
Camera.Parameters parameters) {
Camera.Size result=null;
for ( Camera.Size size : parameters.getSupportedPreviewSizes()) {
if (size.width<=width && size.height<=height) {
if (result==null) {
result=size;
}
else {
int resultArea=result.width*result.height;
int newArea=size.width*size.height;
if (newArea>resultArea) {
result=size;
}
}
}
}
return(result);
}
您可能在Camera.open()
中调用surfaceCreated
时遇到问题,而不检查相机是否已被打开。尝试将该通话移至您的onCreate
和onResume
方法,并在Camera.release()
方法中添加onPause
来电,这样您就不会尝试多次打开相机。