2013-10-29 12 views
8

Ho una domanda su come scattare un'immagine utilizzando l'intento della fotocamera (o l'API della fotocamera) e quindi portare l'immagine in un'immagine che io possa visualizzare nella mia applicazione. Questo è quello che ho finora.Scatta una foto con l'intento della videocamera e visualizzala in imageView o textView?

I ha installato un pulsante

Button btnPicture = (Button) findViewById(R.id.btn_picture); 
    btnPicture.setOnClickListener(this); 

ho messa a punto di un metodo telecamera

private void Camera() { 
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); 
    startActivityForResult(intent, TAKE_PICTURE_CODE); 
    intent.setAction(Intent.ACTION_GET_CONTENT); 
    intent.addCategory(Intent.CATEGORY_OPENABLE); 
    startActivityForResult(intent, REQUEST_CODE); 
} 

E questo è dove mi sono perso. Sto cercando di elaborare l'immagine che ho scattato.

private void processImage(Intent intent) { 
    setContentView(R.layout.imagelayout); 
    ImageView imageView = (ImageView)findViewById(R.id.image_view); 
    cameraBitmap = (Bitmap)intent.getExtras().get("data"); 
    imageView.setImageBitmap(cameraBitmap); 
} 

Il mio intento è quello di visualizzare l'immagine che hai scattato all'interno di image_view. Non ricevo un errore, non succede nulla. Quando scatto la foto, mi viene chiesto di scattare un'altra foto o dopo aver usato il pulsante di chiusura del dispositivo, la forza dell'applicazione si chiude. Sembra che io sia completamente escluso dalla mia applicazione, e il ritorno è un grosso problema. Eventuali suggerimenti? Cosa mi manca?

O sì, e qui è il mio onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
     if(TAKE_PICTURE_CODE == requestCode) { 

     Bundle extras = data.getExtras(); 
     if (extras.containsKey("data")) { 
      Bitmap bmp = (Bitmap) extras.get("data"); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      bmp.compress(Bitmap.CompressFormat.PNG, 100, baos); 
      byte[] image = baos.toByteArray(); 
      if (image != null) { 
       Log.d(TAG, "image != null"); 
      } 

     } else { 
      Toast.makeText(getBaseContext(), "Fail to capture image", Toast.LENGTH_LONG).show(); 
     } 

    } 
} 

Sto cercando di mettere l'immagine in getExtras, e poi conservarlo in un ByteArray. Un'altra cosa che stavo cercando di fare. Non sono sicuro di come tutto si riunisce.

+1

Inserisci il tuo codice per 'onActivityResult()' .. –

risposta

14

Il metodo che ho trovato per essere facile e utile è questa:

MainActivity

private static String root = null; 
private static String imageFolderPath = null;   
private String imageName = null; 
private static Uri fileUri = null; 
private static final int CAMERA_IMAGE_REQUEST=1; 

public void captureImage(View view) { 

    ImageView imageView = (ImageView) findViewById(R.id.capturedImageview); 

      // fetching the root directory 
    root = Environment.getExternalStorageDirectory().toString() 
    + "/Your_Folder"; 

    // Creating folders for Image 
    imageFolderPath = root + "/saved_images"; 
    File imagesFolder = new File(imageFolderPath); 
    imagesFolder.mkdirs(); 

    // Generating file name 
    imageName = "test.png"; 

    // Creating image here 

    File image = new File(imageFolderPath, imageName); 

    fileUri = Uri.fromFile(image); 

    imageView.setTag(imageFolderPath + File.separator + imageName); 

    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 

    startActivityForResult(takePictureIntent, 
      CAMERA_IMAGE_REQUEST); 

} 

e poi nella vostra attività onActivityResult metodo:

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    // TODO Auto-generated method stub 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == RESULT_OK) { 

     switch (requestCode) { 
     case CAMERA_IMAGE_REQUEST: 

      Bitmap bitmap = null; 
      try { 
       GetImageThumbnail getImageThumbnail = new GetImageThumbnail(); 
       bitmap = getImageThumbnail.getThumbnail(fileUri, this); 
      } catch (FileNotFoundException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } catch (IOException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      // Setting image image icon on the imageview 

      ImageView imageView = (ImageView) this 
        .findViewById(R.id.capturedImageview); 

      imageView.setImageBitmap(bitmap); 

      break; 

     default: 
      Toast.makeText(this, "Something went wrong...", 
        Toast.LENGTH_SHORT).show(); 
      break; 
     } 

    } 
} 

GetImageThumbnail.java

public class GetImageThumbnail { 

private static int getPowerOfTwoForSampleRatio(double ratio) { 
    int k = Integer.highestOneBit((int) Math.floor(ratio)); 
    if (k == 0) 
     return 1; 
    else 
     return k; 
} 

public Bitmap getThumbnail(Uri uri, Context context) 
     throws FileNotFoundException, IOException { 
    InputStream input = context.getContentResolver().openInputStream(uri); 

    BitmapFactory.Options onlyBoundsOptions = new BitmapFactory.Options(); 
    onlyBoundsOptions.inJustDecodeBounds = true; 
    onlyBoundsOptions.inDither = true;// optional 
    onlyBoundsOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;// optional 
    BitmapFactory.decodeStream(input, null, onlyBoundsOptions); 
    input.close(); 
    if ((onlyBoundsOptions.outWidth == -1) 
      || (onlyBoundsOptions.outHeight == -1)) 
     return null; 

    int originalSize = (onlyBoundsOptions.outHeight > onlyBoundsOptions.outWidth) ? onlyBoundsOptions.outHeight 
      : onlyBoundsOptions.outWidth; 

    double ratio = (originalSize > 400) ? (originalSize/350) : 1.0; 

    BitmapFactory.Options bitmapOptions = new BitmapFactory.Options(); 
    bitmapOptions.inSampleSize = getPowerOfTwoForSampleRatio(ratio); 
    bitmapOptions.inDither = true;// optional 
    bitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_8888;// optional 
    input = context.getContentResolver().openInputStream(uri); 
    Bitmap bitmap = BitmapFactory.decodeStream(input, null, bitmapOptions); 
    input.close(); 
    return bitmap; 
} 
} 

e poi sul ImageView onclick metodo sarà simile a questo:

public void showFullImage(View view) { 
    String path = (String) view.getTag(); 

    if (path != null) { 

     Intent intent = new Intent(); 
     intent.setAction(Intent.ACTION_VIEW); 
     Uri imgUri = Uri.parse("file://" + path); 
     intent.setDataAndType(imgUri, "image/*"); 
     startActivity(intent); 

    } 

} 
+0

Grazie, il tuo esempio è esteso ma ha aiutato. Sto affrontando la forza si chiude però. Quando mi sbarazzerò della sola linea BoundsOptions.inJustDecodeBounds che sembra risolvere il problema ma le cose ancora non funzionano come vorrei. Continuerò a intromettermi. Ma mi hai aiutato a progredire, grazie! – portfoliobuilder

+0

@portfoliobuilder welcome .. :) –

+0

Questo funziona. Prendi in considerazione l'idea di rendere getThumbnail() statico, non hai bisogno di un'istanza della sua classe per usarlo. – lemuel

3

Per scattare foto in modo corretto è necessario conservarla in file temporaneo, in quanto i dati di intenti risultato può essere nullo:

final Intent pickIntent = new Intent(); 
pickIntent.setType("image/*"); 
pickIntent.setAction(Intent.ACTION_GET_CONTENT); 
final String pickTitle = activity.getString(R.string.choose_image); 
final Intent chooserIntent = Intent.createChooser(pickIntent, pickTitle); 
if (AvailabilityUtils.isExternalStorageReady()) { 
    final Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    final Uri fileUri = getCameraTempFileUri(activity, true); 
    takePhotoIntent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri); 
    chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, 
    new Intent[] { takePhotoIntent }); 
} 

activity.startActivityForResult(chooserIntent, REQUEST_CODE); 

e quindi ottenere foto di Uri:

if (requestCode == ProfileDataView.REQUEST_CODE 
       && resultCode == Activity.RESULT_OK) { 
      final Uri dataUri = data == null ? getCameraTempFileUri(context, 
       false) : data.getData(); 
       final ParcelFileDescriptor pfd = context.getContentResolver() 
        .openFileDescriptor(imageUri, "r"); 
       final FileDescriptor fd = pfd.getFileDescriptor(); 
       final Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fd); 
     } 
+0

10x, ma dovresti pubblicare anche 'getCameraTempFileUri()'. – WindRider

Problemi correlati