2016-08-17 63 views
0

我想要做的是使用相機意圖拍攝一張照片,記下URI(我將稍後使用此通過Firebase存儲上傳圖像),旋轉圖像(如果需要),然後在ImageView中顯示圖像。這就是我現在這樣做的情況,在AVD和Sony Xperia Z2上運行的Marshmallow 6.0.1都可以。但是,在運行Lollipop 5.0.1Samsung Galaxy S4上進行測試時,我遇到了問題。代碼無法在指定的文件路徑中找到圖像。我也嘗試通過使用photoURI來設置ImageView,並且我還嘗試在創建相機意圖時註釋額外信息,並通過data.getData()獲取數據 - 這些方法都不起作用。我只需要一種方法就可以從該設備獲取此圖像,而不會崩潰,並且理想情況下不會影響設備兼容性。安卓相機意圖問題與一些設備

編輯:引導照相機意圖接管,都photoFilepath 和photoURI有價值。只要我得到onActivityResult, 都返回null。

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    BitmapFactory.Options opt = new BitmapFactory.Options(); 
    opt.inSampleSize = 8; 
    if (resultCode == RESULT_OK) { 
     if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE){ 
      try { 
       Bitmap bit = BitmapFactory.decodeFile(photoFilepath, opt); 
       Bitmap rotated = rotateImg(bit, photoFilepath); 
       userPhoto.setImageBitmap(rotated); 
       contentsOfImageView = rotated; 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Toast.makeText(this, "Error retrieving photo, please try again", Toast.LENGTH_LONG).show(); 
       contentsOfImageView = null; 
      } 
     } // else if here for handling getting images from gallery 
     addBtn.setVisibility(View.INVISIBLE); 
     clearBtn.setVisibility(View.VISIBLE); 
    } else { // Result was a failure 
     //Toast.makeText(this, "Picture wasn't taken!", Toast.LENGTH_SHORT).show(); 
    } 

} 

private void dispatchTakePictureIntent() { 
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    // Ensure that there's a camera activity to handle the intent 
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
     // Create the File where the photo should go 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      // Error occurred while creating the File 
      Log.d(TAG, ex.toString()); 
     } 
     // Continue only if the File was successfully created 
     if (photoFile != null) { 
      photoURI = FileProvider.getUriForFile(this, 
        "com.example.intheactualcodethisismypackagename", 
        photoFile); 
      takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
      startActivityForResult(takePictureIntent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE); 
     } 
    } 
} 

private File createImageFile() throws IOException { 
    // Create an image file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(
      imageFileName, /* prefix */ 
      ".jpg",   /* suffix */ 
      storageDir  /* directory */ 
    ); 

    // Save a file: path for use with ACTION_VIEW intents 
    photoFilepath = image.getAbsolutePath(); 
    return image; 
} 

private Bitmap rotateImg(Bitmap before, String path) { 
    ExifInterface exif = null; 
    try { 
     exif = new ExifInterface(path); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED); 
    Matrix matrix = new Matrix(); 
    switch (orientation) { 
     case ExifInterface.ORIENTATION_ROTATE_90: 
      matrix.setRotate(90); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_180: 
      matrix.setRotate(180); 
      break; 
     case ExifInterface.ORIENTATION_ROTATE_270: 
      matrix.setRotate(270); 
      break; 
     default: 
      break; 

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

回答

2

只要我到onActivityResult,都返回NULL。

很可能,當您的應用程序在後臺並且相機應用程序處於前臺時,您的進程已被終止。這是非常正常的,儘管它是否發生在任何給定的ACTION_IMAGE_CAPTURE請求上都會有所不同。

確保你不放相關的東西,比如你Uri和/或File,在保存實例狀態Bundle,如this sample app

/*** 
Copyright (c) 2008-2016 CommonsWare, LLC 
Licensed under the Apache License, Version 2.0 (the "License"); you may not 
use this file except in compliance with the License. You may obtain a copy 
of the License at http://www.apache.org/licenses/LICENSE-2.0. Unless required 
by applicable law or agreed to in writing, software distributed under the 
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS 
OF ANY KIND, either express or implied. See the License for the specific 
language governing permissions and limitations under the License. 

From _The Busy Coder's Guide to Android Development_ 
https://commonsware.com/Android 
*/ 

package com.commonsware.android.camcon; 

import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.PackageManager; 
import android.content.pm.ResolveInfo; 
import android.net.Uri; 
import android.os.Build; 
import android.os.Bundle; 
import android.provider.MediaStore; 
import android.support.v4.content.FileProvider; 
import java.io.File; 
import java.util.List; 

public class CameraContentDemoActivity extends Activity { 
    private static final String EXTRA_FILENAME= 
    "com.commonsware.android.camcon.EXTRA_FILENAME"; 
    private static final String FILENAME="CameraContentDemo.jpeg"; 
    private static final int CONTENT_REQUEST=1337; 
    private static final String AUTHORITY= 
    BuildConfig.APPLICATION_ID+".provider"; 
    private static final String PHOTOS="photos"; 
    private File output=null; 
    private Uri outputUri=null; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent i=new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 

    if (savedInstanceState==null) { 
     output=new File(new File(getFilesDir(), PHOTOS), FILENAME); 

     if (output.exists()) { 
     output.delete(); 
     } 
     else { 
     output.getParentFile().mkdirs(); 
     } 
    } 
    else { 
     output=(File)savedInstanceState.getSerializable(EXTRA_FILENAME); 
    } 

    outputUri=FileProvider.getUriForFile(this, AUTHORITY, output); 

    if (savedInstanceState==null) { 
     i.putExtra(MediaStore.EXTRA_OUTPUT, outputUri); 

     if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP) { 
     i.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 
     } 
     else { 
     List<ResolveInfo> resInfoList= 
      getPackageManager() 
      .queryIntentActivities(i, PackageManager.MATCH_DEFAULT_ONLY); 

     for (ResolveInfo resolveInfo : resInfoList) { 
      String packageName = resolveInfo.activityInfo.packageName; 
      grantUriPermission(packageName, outputUri, 
      Intent.FLAG_GRANT_WRITE_URI_PERMISSION | 
       Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     } 
     } 

     startActivityForResult(i, CONTENT_REQUEST); 
    } 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 

    outState.putSerializable(EXTRA_FILENAME, output); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent data) { 
    if (requestCode == CONTENT_REQUEST) { 
     if (resultCode == RESULT_OK) { 
     Intent i=new Intent(Intent.ACTION_VIEW); 

     i.setDataAndType(outputUri, "image/jpeg"); 
     i.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); 
     startActivity(i); 
     finish(); 
     } 
    } 
    } 
}