2012-07-16 141 views
0

我有2个问题,我的应用程序:应用崩溃时试图拍照

- 它崩溃拍照
- 它崩溃时,当我旋转设备

cameraPreview.java:

public class CameraPreview extends Activity implements SurfaceHolder.Callback 
    { 
    Camera camera; 
    SurfaceView preview; 
    SurfaceHolder holder; 
    LayoutInflater controlInflater = null; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
     WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.activity_camera_preview); 
     getWindow().setFormat(PixelFormat.UNKNOWN); 

     preview = (SurfaceView) findViewById(R.id.surface1); 
     holder = preview.getHolder(); 
     holder.addCallback(this); 
     //holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

     controlInflater = LayoutInflater.from(getBaseContext()); 
     View viewControl = controlInflater.inflate(R.layout.control, null); 
     LayoutParams layoutParamsControl = new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT); 
     this.addContentView(viewControl, layoutParamsControl); } 
    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) 
    { 
     Camera camera = Camera.open();  
     Configuration c = getResources().getConfiguration(); 

     if(c.orientation == Configuration.ORIENTATION_PORTRAIT) 
     { 
      camera.setDisplayOrientation(90); 
     } 

     if(camera!=null) 
     { 
      try 
      { 
       camera.setPreviewDisplay(holder); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
      } 
      camera.startPreview(); 
      }} 

      public void surfaceCreated(SurfaceHolder holder) 
      { 

      } 
    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     if(camera!=null) 
     { 
      camera.stopPreview(); 
      camera.setPreviewCallback(null); 
      camera.release();  
      camera=null; 
     } 
    } 

    PictureCallback myPictureCallback_JPG = new PictureCallback() 
    { 
     @Override 
     public void onPictureTaken(byte[] arg0, Camera arg1) 
     { 
      Bitmap bitmapPicture = BitmapFactory.decodeByteArray(arg0, 0, arg0.length); 
     } 
    }; 

    public void take_picture_onClick(View view) 
    { 
     camera.takePicture(null, null, myPictureCallback_JPG); 
    } } 

的AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.paparazzi" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="15" /> 
<uses-permission android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-feature android:name="android.hardware.camera" android:required="true"/> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" 
     android:debuggable="true" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/title_activity_main" > 

     </activity> 
     <activity 
      android:name=".CameraPreview" 
      android:configChanges="orientation" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

起初,我认为第二个问题可能是由缺乏这部分的原因造成的:

public void surfaceDestroyed(SurfaceHolder holder) 
    { 
    if(camera!=null) 
    { 
     camera.stopPreview(); 
     camera.setPreviewCallback(null); 
     camera.release();  
     camera=null; 
    } 
} 

但加入之后什么都没有改变。

至于第一个问题,我不知道什么是错的。该应用程序已在3种不同的设备上进行测试我将不胜感激任何建议。

编辑

好了,所以我试图让日志的建议,但我不知道我在做正确的事:

public void take_picture_onClick(View view) 
    { 
     try 
     { 
      camera.takePicture(null, null, myPictureCallback_JPG); 
     } 
     catch(Exception ee) 
     { 

       try { 
        File filename = new File(Environment.getExternalStorageDirectory()+"/logfile4.log"); 
        filename.createNewFile(); 
        String cmd = "logcat -d -f "+filename.getAbsolutePath(); 
        Runtime.getRuntime().exec(cmd); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

    } 

日志文件被创建,但它是空的,即使我给它一点时间加载。

+0

logcat错误报告在哪里? – 2012-07-16 07:45:22

+0

如果我在设备上运行应用程序,该如何获得此报告?我认为这只能在模拟器上进行,对不起。 – 2012-07-16 07:58:31

+0

您可以改为通过文件写入机制在sdcard上写入日志。没有日志,很难指出错误。 – AAnkit 2012-07-16 08:13:43

回答

1

好了,第二个问题是由这部分引起的(我认为)

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
int height) 
{ 
    Camera camera = Camera.open(); 

相机应该是一个字段,而不是创建的每个surfaceChanged被调用时。现在它工作正常。

编辑
实际上,拍照也很好。谢谢你的建议。

相关问题