2010-10-14 7 views
2

J'ai testé mon application sur le SDK Android sur tout de 1.5 à 2.2 et le code de la caméra dans mon activité fonctionne très bien. L'exécuter sur un périphérique avec 2.1 fonctionne également. Mais la même application ne fonctionne pas avec 2.2 sur HTC Desire et Nexus One et les accidents de l'application. Des idées pour lesquelles ils pourraient se produire?Appareil photo se bloque dans Android 2.2

Am utilisant Importer android.hardware.Camera;.

intérieur onCreate J'ai ceci:

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

Et le rappel est

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

En général, la plupart SO des questions impliquant un accident Android finira par être ignorée, sauf si vous incluez un copier-coller de la trace d'erreur de Logcat . C'est facile à faire et aide souvent les autres développeurs à identifier le problème très rapidement. –

+0

Il ne plante pas sur mon SDK et Android 2.1 que j'ai. Donc, ne vois pas d'erreurs dans le logcat (je l'ai essayé dans le SDK et cela a fonctionné). Crasher sur le téléphone d'un ami qui se trouve à quelques centaines de kilomètres. :( – Abhinav

Répondre

9

besoin de définir la taille de l'aperçu de l'appareil après avoir obtenu la taille de la caméra optimale. Voici les détails et le code pour le FIX-

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

+2

-1, S'il vous plaît Poster réponse ici parce que personne ne va lire votre longue liste de conversation –

+0

Ce n'est pas ma longue liste de conversation.Il est un rapport de bugs assez complet avec différentes captures d'écran et différentes solutions pour différents appareils qui ne peuvent pas peut-être tenir dans une réponse.S'il vous plaît ne pas dispenser downvotes sans connaître le problème – Abhinav

+2

mis à jour simplement pour annuler la baisse idiote. – ajacian81

0

Le problème est que la largeur et la hauteur adoptée par la méthode surfaceChanged n'est pas une taille de prévisualisation pris en charge. Par conséquent, si vous souhaitez définir la taille de l'aperçu (paramètres.setPreviewSize), vous devez définir une taille d'aperçu prise en charge. La méthode getPreviewSize() renvoie une taille d'aperçu disponible. Ainsi, votre méthode surfaceChanged peut être comme ça:

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(); 
} 

Vous pouvez également obtenir une liste des tailles de prévisualisation pris en charge en utilisant la méthode getSupportedPreviewSizes() disponible à partir de la version Android api 5.

0

Vous devez prendre la photo de la caméra puis vous devez recadrer, puis enregistrer ou définir.

Vous pouvez utiliser ce code.

   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 maintenant l'image utilisée 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(); 
     } 
    } 
Questions connexes