非常に基本的なカメラ アプリケーションを開発しているときに、一連の非常に具体的なエラーが発生しました。コードは、Android Web サイトのコードとほぼ同じです。
Galaxy SII は、LogCat コンソールに次のようなエラーが表示される唯一の電話です。
06-28 16:28:40.098: E/Surface(1650): Surface::init token -2 identity 18
「ID」に続く数字 (42、38 など) は変わりますが、エラーは解決しません。
これは次のクラスに関連している可能性があると思いますが、その意味についてはまだ不明です。
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback
Galaxy SII でこのエラーが発生する可能性はありますか? HTC Vivid と Pantech Burst でもテストしています。これがより大きな問題につながるのではないかと心配しています。このエラーが何であるかを理解しようとしています。
ソースは次のとおりです。
package com.basicam.android;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.hardware.Camera;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.widget.Toast;
public class CamActivity extends Activity {
private SurfaceView preview=null;
private SurfaceHolder previewHolder=null;
private Camera camera=null;
private boolean inPreview=false;
private boolean cameraConfigured=false;
@Override
public void onCreate(Bundle savedInstanceState) {
Log.d("crap","oncreated");
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
preview=(SurfaceView)findViewById(R.id.preview);
previewHolder=preview.getHolder();
previewHolder.addCallback(surfaceCallback);
previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
@Override
public void onResume() {
super.onResume();
camera=Camera.open();
startPreview();
}
@Override
public void onPause() {
if (inPreview) {
camera.stopPreview();
}
camera.release();
camera=null;
inPreview=false;
super.onPause();
}
private Camera.Size getBestPreviewSize(int width, int height,
Camera cam) {
Camera.Size result=null;
Log.d("crap", "can haz preview sizes?");
int i = 0;
for (Camera.Size size : cam.getParameters().getSupportedPictureSizes()) {
Log.d("sizew", ""+size.width);
if (size.width<=width && size.height<=height) {
Log.d("sizew", ""+size.width);
Log.d("sizeh", ""+size.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);
}
private void initPreview(int width, int height) {
if (camera!=null && previewHolder.getSurface()!=null) {
try {
camera.setPreviewDisplay(previewHolder);
}
catch (Throwable t) {
Log.e("PreviewDemo-surfaceCallback",
"Exception in setPreviewDisplay()", t);
}
if (!cameraConfigured) {
Camera.Parameters parameters=camera.getParameters();
Camera.Size size=getBestPreviewSize(width, height,
camera);
if (size!=null) {
parameters.setPreviewSize(size.width, size.height);
camera.setParameters(parameters);
cameraConfigured=true;
}
}
}
}
private void startPreview() {
if (cameraConfigured && camera!=null) {
camera.startPreview();
inPreview=true;
}
}
SurfaceHolder.Callback surfaceCallback=new SurfaceHolder.Callback() {
public void surfaceCreated(SurfaceHolder holder) {
// no-op -- wait until surfaceChanged()
}
public void surfaceChanged(SurfaceHolder holder,
int format, int width,
int height) {
initPreview(width, height);
startPreview();
}
public void surfaceDestroyed(SurfaceHolder holder) {
// no-op
}
};
}