2010-10-14 119 views
2

我已經在Android SDK上測試了我的應用程序,從1.5到2.2,我的活動中的相機代碼工作正常。在裝有2.1的設備上運行它也正在運行。但同樣的應用程序不適用於HTC Desire和Nexus One上的2.2以及應用程序崩潰。任何想法爲什麼他們可能會發生?Android 2.2中的相機崩潰

正在使用import android.hardware.Camera;

裏面的onCreate我有這樣的:

preview = (SurfaceView) findViewById(R.id.preview); 
     previewHolder = preview.getHolder(); 
     previewHolder.addCallback(surfaceCallback); 
     previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

而且回調

SurfaceHolder.Callback surfaceCallback = new SurfaceHolder.Callback() { 

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

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     camera = Camera.open(); 
     try { 
      camera.setPreviewDisplay(previewHolder); 
     } catch (Throwable t) { 
      Log.e(TAG, "Exception in setPreviewDisplay", t); 
      Toast.makeText(CameraActivity.this, t.getMessage(), 
        Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    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(); 
    } 
}; 
+0

一般來說,大多數SO涉及一個Android崩潰最終將問題得到忽略,除非您包括logcat的誤差跟蹤的複製粘貼。這很容易做到,並且通常可以幫助其他開發人員很快識別問題。 – 2010-10-14 18:31:40

+0

它沒有崩潰在我的SDK和Android 2.1上。所以在logcat中看不到任何錯誤(我在SDK中試過並且它工作正常)。碰撞幾百公里外的朋友的電話。 :( – Abhinav 2010-10-14 18:50:46

回答

9

需要得到最佳的相機尺寸後設置相機的預覽大小。下面是詳細信息和用於FIX-

http://code.google.com/p/android/issues/detail?id=7909

+2

-1,請在這裏發帖回答,因爲沒有人會閱讀你長長的談話清單 – 2011-04-09 14:33:13

+0

這不是我長長的談話清單,它是一個非常全面的錯誤報告,不同的屏幕截圖和不同的解決方案,可能適合一個答案,請不要在不知道該問題的情況下分配評論數。 – Abhinav 2011-04-09 16:09:31

+2

只是爲了取消愚蠢的downvote而投了贊成票。 – ajacian81 2011-08-22 15:45:20

0

問題的代碼,該寬度和高度由surfaceChanged方法傳遞是不支持的預覽大小。

所以,如果你想設置預覽大小(parameters.setPreviewSize),你需要設置一個支持的預覽大小。方法getPreviewSize()返回可用的預覽大小。所以,你的surfaceChanged方法是這樣的:

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
    Camera.Parameters parameters = camera.getParameters(); 

    Size pSize = camera.getParameters().getPreviewSize(); 
    Log.d(TAG, "Setting preview size: " + pSize.width + " x " + pSize.height); 

    parameters.setPreviewSize(pSize.width, pSize.height); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 

您也可以使用該方法getSupportedPreviewSizes()可用的Android API版本5.

0

你必須採取從相機照片,然後得到支持預覽尺寸的列表你必須裁剪,然後保存或設置。

您可以使用此代碼。

   Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);     
       mImageCaptureUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"connectR_" + String.valueOf(System.currentTimeMillis()) + ".jpg")); 
       intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageCaptureUri); 
       try { 
        intent.putExtra("return-data", true);      
        startActivityForResult(intent, PICK_FROM_CAMERA); 
       } catch (ActivityNotFoundException e) { 
        e.printStackTrace(); 
       } 

OnActivityResult。

case PICK_FROM_CAMERA: 
      doCrop();    
      break; 

現在croping圖像使用doCrop()

final ArrayList<CropOption> cropOptions = new ArrayList<CropOption>();  
    Intent intent = new Intent("com.android.camera.action.CROP"); 
    intent.setType("image/*");   
    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 0);   
    int size = list.size();   
    if (size == 0) {    
     Toast.makeText(this, "Can not find image crop app", Toast.LENGTH_SHORT).show();   
     return; 
    } else { 
     intent.setData(mImageCaptureUri);    
     intent.putExtra("outputX", 200); 
     intent.putExtra("outputY", 200); 
     intent.putExtra("aspectX", 1); 
     intent.putExtra("aspectY", 1); 
     intent.putExtra("scale", true); 
     intent.putExtra("return-data", true); 

     if (size == 1) { 
      Intent i  = new Intent(intent); 
      ResolveInfo res = list.get(0);    
      i.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));     
      startActivityForResult(i, CROP_FROM_CAMERA); 
     } else { 
      for (ResolveInfo res : list) { 
       final CropOption co = new CropOption();     
       co.title = getPackageManager().getApplicationLabel(res.activityInfo.applicationInfo); 
       co.icon  = getPackageManager().getApplicationIcon(res.activityInfo.applicationInfo); 
       co.appIntent= new Intent(intent);     
       co.appIntent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name)); 
       cropOptions.add(co); 
      } 

      CropOptionAdapter adapter = new CropOptionAdapter(getApplicationContext(), cropOptions); 

      AlertDialog.Builder builder = new AlertDialog.Builder(this); 
      builder.setTitle("Choose Crop App"); 
      builder.setAdapter(adapter, new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int item) { 
        startActivityForResult(cropOptions.get(item).appIntent, CROP_FROM_CAMERA); 
       } 
      }); 

      builder.setOnCancelListener(new DialogInterface.OnCancelListener() { 
       @Override 
       public void onCancel(DialogInterface dialog) { 

        if (mImageCaptureUri != null) { 
         getContentResolver().delete(mImageCaptureUri, null, null); 
         mImageCaptureUri = null; 
        } 
       } 
      }); 

      AlertDialog alert = builder.create(); 

      alert.show(); 
     } 
    }