2016-08-17 20 views
0

私がやりたいことは、カメラの意図を使って写真を撮り、URIを書き留めて(私はFirebaseストレージ経由で画像をアップロードするためにこれを使用します)、イメージを表示し、次にImageViewにイメージを表示します。これは、私が現時点でこれをやっているところで、AVDとSony Xperia Z2Marshmallow 6.0.1)で動作します。しかし、Samsung Galaxy S4Lollipop 5.0.1を実行してテストした場合、私は問題があります。コードは、指定されたファイルパスでイメージを見つけることができません。私はまた、photoURIを使用してImageViewを設定しようとしましたが、カメラインテントを作成するときにエクストラをコメントアウトしてみました。data.getData() - これらの方法は機能していません。私は、このデバイスからこのイメージを取得する方法が必要です。デバイスの互換性を損なうことなく、理想的にはクラッシュせずに。一部のデバイスでAndroidカメラの問題が発生する

EDIT:カメラの意図を引き継いで、photoFilepath とphotoURIの両方に値があります。私がonActivityResultに着くとすぐに、 は両方ともnullを返します。できるだけ早く私は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

ほとんどの場合、アプリがバックグラウンドにあり、カメラアプリがフォアグラウンドになっている間にプロセスが終了した可能性があります。これは完全に正常ですが、何らかの指定があった場合にACTION_IMAGE_CAPTURE要求が変わるかどうかは関係ありません。

などthis sample appのように、保存されたインスタンスの状態Bundleで、あなたのUriおよび/またはFileのように、あなたは、関連するものを握っていることを確認してください:

/*** 
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(); 
     } 
    } 
    } 
} 
関連する問題