在onPictureTaken中调用位图

时间:2014-11-27 07:31:04

标签: android android-layout android-camera

如何在onPictureTaken方法中调用Bitmap?除非我重新启动手机,否则图像不会存储在图库中

请帮助重新安排代码。

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

    }

};

图像不存储在SD卡中直到我重新启动手机,并且存储的图像也以错误的方向存储。如果以纵向拍摄照片,则图像以横向方式存储。如何以正确的方向存储图像。

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

1 个答案:

答案 0 :(得分: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());
        }

    }

}