2017-07-06 5 views
0

カメラアプリを起動して画像を保存して、キャプチャした画像のビットマップを表示するコードを作成しようとしています。(Android)カメラキャプチャが保存できません。画像のビットマップを読み込めません。

これはhttps://guides.codepath.com/android/Accessing-the-Camera-and-Stored-Mediaから適合された関連するコードである:私はまた、次の権限が

public static final int PICTURE_REQUEST_CODE = 1034; 
    public static final String FILE_BEGIN = "note"; 
    private int note_id = 4; 
    public static final String FILE_END = ".jpg"; 
    private static final String APP_TAG = "School_App"; 

    private void takePicture() { 
    Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
    i.putExtra(MediaStore.EXTRA_OUTPUT, getPhotoFileUri(FILE_BEGIN + note_id + FILE_END)); 
    if (i.resolveActivity(getPackageManager()) != null){ 
     startActivityForResult(i, PICTURE_REQUEST_CODE); 
    } 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == PICTURE_REQUEST_CODE) { 
     if (resultCode == RESULT_OK) { 
      Uri takenPhotoUri = getPhotoFileUri(FILE_BEGIN + note_id + FILE_END); 
      Log.d("NotesDetail", takenPhotoUri.toString()); 
      // by this point we have the camera photo on disk 
      Bitmap takenImage = BitmapFactory.decodeFile(takenPhotoUri.getPath()); 
      // RESIZE BITMAP, see section below 
      // Load the taken image into a preview 
      ImageView ivPreview = (ImageView) findViewById(R.id.iv_notes_picture); 
      ivPreview.setImageBitmap(takenImage); 
     } else { // Result was a failure 
      Toast.makeText(this, "Picture wasn't taken!", Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 

private Uri getPhotoFileUri(String fileName) { 
    if(isSpaceAvailable()){ 
     File mediaStorageDir = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), APP_TAG); 

     if (!mediaStorageDir.exists() && !mediaStorageDir.mkdirs()){ 
      Log.d(APP_TAG, "Failed to make directory"); 
     } 

     File file = new File(mediaStorageDir.getPath() + File.separator + fileName); 

     Uri uri = FileProvider.getUriForFile(NotesDetail.this, "com.kfode.schoolapp.fileprovider", file); 
     Log.d("getPhotoFileUri", uri.toString()); 
     return uri; 
    } 
    return null; 
} 

private boolean isSpaceAvailable() { 
    String state = Environment.getExternalStorageState(); 
    return state.equals(Environment.MEDIA_MOUNTED); 
} 

設定した:マニフェストのアプリケーションタグ内

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

...

<provider 
     android:name="android.support.v4.content.FileProvider" 
     android:authorities="com.kfode.schoolapp.fileprovider" 
     android:exported="false" 
     android:grantUriPermissions="true"> 
     <meta-data 
      android:name="android.support.FILE_PROVIDER_PATHS" 
      android:resource="@xml/file_paths" 
      /> 
    </provider> 

そして、file_paths.xml内

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
<external-files-path name="images" 
    path="Pictures"/> 

私はアプリを実行すると、私は次のログメッセージと例外を取得:

D/getPhotoFileUri: content://com.kfode.schoolapp.fileprovider/images/School_App/note4.jpg 
D/NotesDetail: content://com.kfode.schoolapp.fileprovider/images/School_App/note4.jpg 
E/BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /images/School_App/note4.jpg: open failed: ENOENT (No such file or directory) 

ないここで起こっていることを確認します。助けてください?

答えて

0
Bitmap takenImage = BitmapFactory.decodeFile(takenPhotoUri.getPath()); 

これは機能しません。 UriFileではありません。二つの方法に

リファクタリングgetPhotoFileUri()

  • getPhotoFile()あなたの、画像ローディングライブラリを使用するとそのFile

ためFileProviderUriを取得File

  • getPhotoFileUri()(グライドを生成し、 Picassoなど)を使用してから返されたファイルからImageViewを入力します。これはあなたのためのすべてのBitmapFactoryのものを扱うだけでなく、バ​​ックグラウンドスレッドでも動作しますので、現在のコードと同じようにUIを固定しないでください。

  • +0

    ありがとうございました! :) – user2991144

    関連する問題