2017-06-24 16 views
0

FileProviderを使用してMarshmallowとNougatでカメラを開き、onActivityResultメソッドのキャプチャ画像を表示するビットマップを取得しようとしていません。イメージパスから。ここに私のコード私はあなたがカメラやギャラリーのために、このライブラリを使用するために持っていると思うイメージのビットマップをonActivityResultで取得し、画像をイメージビューで設定した後に画像を削除する方法

image_click.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       dispatchTakePictureIntent(); 
      } 
     }); 



    } 

    static final int REQUEST_TAKE_PHOTO = 1; 

    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 

      } 
      // Continue only if the File was successfully created 
      if (photoFile != null) { 
       photoURI = FileProvider.getUriForFile(this, 
         "com.xyz.dummyapp.fileprovider", 
         photoFile); 
       takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); 
       startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); 
      } 
     } 
    } 

    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 
     mCurrentPhotoPath = image.getAbsolutePath(); 
     return image; 
    } 
    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) { 
      try{ 
       Bitmap bitmap = BitmapFactory.decodeFile(photoURI.getPath()); 
       mImageView.setImageURI(photoURI); 
      File file=new File(mCurrentPhotoPath); 
      if (file.exists()){ 
       if (file.delete()){ 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          Toast.makeText(getApplicationContext(),"Deleted",Toast.LENGTH_SHORT).show(); 
         } 
        }); 
       } 
      } 
      } 
      catch (Exception e){ 
       e.printStackTrace(); 
      } 

     } 
    } 



<?xml version="1.0" encoding="utf-8"?> 
<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="my_images" path="Android/data/com.xyz.dummyapp/files/Pictures" /> 
</paths> 
+0

あなたは保存されたインスタンス状態 'Bundle'に、' photoURI'またはそれをビルドするものを保存していません。あなたのプロセスは、カメラアプリがフォアグラウンドにある間にいつでも終了することができ、その場合、あなたのフィールドは「ヌル」になります。 [FileProvider]を 'ACTION_IMAGE_CAPTURE'で適切に使用する方法を示す[サンプルアプリケーションはこちら](https://github.com/commonsguy/cw-omnibus/tree/master/Camera/FileProvider)です。 – CommonsWare

答えて

-1

です:https://github.com/jrvansuita/PickImageあなたはこのライブラリはマシュマロとヌガーで正常に動作しているbitmap.andに画像を変換する必要はありません。

0

あなたのコードにすべてが含まれているかどうかわかりません。しかし、ここで注意すべきいくつかのポイントです:

  • あなたは一般的に、ユーザーがデバイスのカメラで取り込み、任意の写真では、デバイス上に保存されなければならないデバイス公開ディレクトリ内の写真

を保存する必要がありますすべてのアプリからアクセスできるように公開されていますその場合

  • docsからの引用) - あなたのAndroidManifest.xmlWRITE_EXTERNAL_STORAGEを宣言する必要があります:

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

  • をアンドロイドマシュマロあなたとその許可を要求しています。ここに簡略化したバージョンがあります:
requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 99); 
... 
.... 
@Override 
public void onRequestPermissionsResult(final int requestCode, @NonNull final String[] permissions, @NonNull final int[] grantResults) { 
     // Execute your code to create the file and start the camera intent here 
} 

here続きを読む)

  • あなたはstorageDir

Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);

  • としてEnvironmentからgetExternalStoragePublicDirectoryを使用することも必要がありあなたのfile_path.xmlPictures/を指している必要があります:
  • onActivityResultあなたは、単に画像に設定するあなたは FileProvider#getUriForFileから受け取っ photoUriフィールドを使用することができて

<external-path name="my_pictures" path="Pictures/"/>

imageView.setImageURI(photoUri);

私の変更は、実際の例を作るのに役立ちます: Take photos with camera and receive image

関連する問題