2014-11-27 3 views
1

Как я могу назвать битмап внутри метода onPictureTaken?. Изображение не сохраняется в галерее до тех пор, пока я не перезапущу свой телефон.Call Bitmap inside onPictureTaken

Пожалуйста, помогите в переустановке кода.

public static int getOrientation(Context context,Uri photoUri){ 
    Cursor cursor = context.getContentResolver().query(photoUri,new String[] {MediaStore.Images.ImageColumns.ORIENTATION},null,null,null); 
    if(cursor.getCount()!=1){ 
     return -1; 
    } 
    cursor.moveToFirst(); 
    return cursor.getInt(0); 

} 

getCorrectlyOrientatedImage() никогда не используется. Пожалуйста, помогите мне, где я могу назвать эту функцию.

public static Bitmap getCorrectlyOrientatedImage(Context context, Uri photoUri)throws IOException{ 
    InputStream is=context.getContentResolver().openInputStream(photoUri); 
    BitmapFactory.Options dbo = new BitmapFactory.Options(); 
    dbo.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(is,null,dbo); 
    is.close(); 

    int rotatedWidth,rotatedHeight; 
    int orientation = getOrientation(context,photoUri); 

    if(orientation == 90 || orientation ==270){ 
     rotatedWidth=dbo.outHeight; 
     rotatedHeight=dbo.outWidth; 
    }else{ 
     rotatedWidth=dbo.outWidth; 
     rotatedHeight=dbo.outHeight; 
    } 

    Bitmap srcBitmap; 
    is = context.getContentResolver().openInputStream(photoUri); 
    if(rotatedWidth > MAX_IMAGE_DIMENSION || rotatedHeight > MAX_IMAGE_DIMENSION){ 
     float widthRatio = ((float) rotatedWidth)/((float) MAX_IMAGE_DIMENSION); 
     float heightRatio = ((float) rotatedHeight)/((float) MAX_IMAGE_DIMENSION); 
     float maxRatio = Math.max(widthRatio,heightRatio); 

     BitmapFactory.Options options = new BitmapFactory.Options(); 
     options.inSampleSize = (int) maxRatio; 
     srcBitmap = BitmapFactory.decodeStream(is, null, options); 
    }else{ 
     srcBitmap = BitmapFactory.decodeStream(is); 
    } 
    is.close(); 

    if(orientation > 0){ 
     Matrix matrix = new Matrix(); 
     matrix.postRotate(orientation); 

     srcBitmap = Bitmap.createBitmap(srcBitmap,0,0,srcBitmap.getWidth(),srcBitmap.getHeight(),matrix,true); 
    } 
    return srcBitmap; 
} 


private PictureCallback mPicture = new PictureCallback() { 


    public void onPictureTaken(byte[] data, Camera camera) { 

     File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
     Log.d("onPictureTaken", "File is assigned to pictureFile"); 
     if (pictureFile == null) { 
      Log.d(DEBUG_TAG, " Error creating a media file, check storage permissions:"); 
      return; 
     } 
     try { 
      Bitmap bitmap=getCorrectlyOrientatedImage() 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
      File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "SELFie"); 
      String path = mediaStorageDir.getPath() + File.separator + "IMG_Some_name.jpg"; 
      SCamera.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path))); 
     } catch (FileNotFoundException e) { 
      Log.d("DG_DEBUG", "File not found: " + e.getMessage()); 
     } catch (IOException e) { 
      Log.d("DG_DEBUG", "Error accessing file: " + e.getMessage()); 
     } 

    } 

}; 

Изображение не хранит в SDCARD, пока я перезагружать телефон, а также изображение, которое хранится хранится в неправильном направлении. Если фотография сделана на портрете, изображение сохраняется в альбомной ориентации. Как сохранить изображение в правильной ориентации.

private static File getOutputMediaFile(int type){ 
    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),"SELFie"); 
    if(!mediaStorageDir.exists()){ 
     if(!mediaStorageDir.mkdir()){ 
      Log.d(DEBUG_TAG,"Filed to create directory"); 
      return null; 
     } 
    } 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE){ 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
       "IMG_"+ timeStamp + ".jpg"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 

ответ

0

Я знаю, что этот вопрос немного старый, но только в том случае, если кто сталкивается с таким же вопросом, решение, чтобы сохранить изображение в фоновом потоке, как показано на this github link.

private PictureCallback mPicture = new PictureCallback() { 

    public void onPictureTaken(byte[] data, Camera camera) { 
     new SaveImageTask().execute(data); 
    } 

}; 


private class SaveImageTask extends AsyncTask<byte[], Void, Void> { 

    @Override 
    protected Void doInBackground(byte[]... data) { 

     File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
     Log.d("onPictureTaken", "File is assigned to pictureFile"); 
     if (pictureFile == null) { 
      Log.d(DEBUG_TAG, " Error creating a media file, check storage permissions:"); 
      return null; 
     } 

     try { 
      Bitmap bitmap=getCorrectlyOrientatedImage() 
      FileOutputStream fos = new FileOutputStream(pictureFile); 
      fos.write(data); 
      fos.close(); 
      File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "SELFie"); 
      String path = mediaStorageDir.getPath() + File.separator + "IMG_Some_name.jpg"; 
      SCamera.this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path))); 
     } catch (FileNotFoundException e) { 
      Log.d("DG_DEBUG", "File not found: " + e.getMessage()); 
     } catch (IOException e) { 
      Log.d("DG_DEBUG", "Error accessing file: " + e.getMessage()); 
     } 

    } 

} 
Смежные вопросы