10

Android 6.0でユーザーに写真を(ギャラリーやカメラアプリから)撮影させる必要があります。Android 6.0で許可なく画像を取り込む

私は私がここで説明するように意図を使用していた、カメラを制御する必要がないので:

しかし、あなたがこのような制御を必要としない場合は、あなただけにACTION_IMAGE_CAPTUREの意図を使用することができます画像をリクエストする。インテントを開始すると、ユーザーはカメラアプリを選択するように促され(デフォルトのカメラアプリがない場合)、そのアプリが写真を撮ります。カメラアプリはあなたのアプリのonActivityResult()メソッドに画像を返します。

https://developer.android.com/preview/features/runtime-permissions.html

しかし、このACTION_IMAGE_CAPTUREのために、あなたは(私は、サムネイルを持つことになり、このPARAMなし)一時ファイルへのURIをある余分な「MediaStore.EXTRA_OUTPUT」を入力する必要があります。この一時ファイルは外部ストレージに保存されている必要があります(カメラアプリからアクセスできるようにする必要があります)。外部ストレージにファイルを作成するには、WRITE_EXTERNAL_STORAGEの許可が必要です。

だから、許可android.permission.CAMERAまたはandroid.permission.WRITE_EXTERNAL_STORAGEせずにネイティブのダイアログ/アプリを介して画像をキャプチャすることはできません。あれは正しいですか?もしあれば

おかげ

+0

あなたが書いた 'ContentProvider'を指し示す' EXTRA_OUTPUT'に 'content://' 'Uri'を渡すことを歓迎します。そこではデータを受け入れることができます。私はこれを試していない、と私の推測は、そのような価値を期待していないカメラアプリの束があり、それに詰まるだろうということです。 – CommonsWare

+0

あなたはこれを回避する方法を見つけましたか? – AndroidEnthusiast

答えて

4

それはアンドロイド4.4以降で可能です、あなたは、Androidの4.4以降でごパッケージ固有 ディレクトリ

下のファイルであることを、MediaStore.EXTRA_OUTPUTを指定することができます 外部記憶装置上のファイルの所有者、グループおよびモードは、ディレクトリ 構造に基づいて合成されます。これにより、アプリケーションは のWRITE_EXTERNAL_STORAGE権限を必要とせずに、パッケージ固有の ディレクトリを外部ストレージに管理することができます。 たとえば、 という名前のcom.example.fooというパッケージを持つアプリは、 の権限を持たない外部ストレージデバイスの Android/data/com.example.foo /に自由にアクセスできます。これらの合成パーミッションは、 FUSEデーモン内のRAW記憶装置をラップすることによって達成されます。

https://source.android.com/devices/storage/

+0

実際にこれを試しましたか?これにより、あなたのアプリはディレクトリにアクセスできますが、CAMERAアプリには問題があります。 –

+0

@Derek Fungさんは、サンプルプロジェクトを共有できますか? –

+0

カメラは、アプリのプライベートキャッシュディレクトリディレクトリにアクセスできません。 @ジョナサン・アステの解決策が働いています。 – Makalele

1

これはCAMERAWRITE_EXTERNAL_STORAGE権限のいずれかなしに可能です。

アプリのキャッシュディレクトリに一時的なファイルを作成し、他のアプリからアクセスできるようにすることができます。これは、カメラアプリでファイルを書き込み可能になります:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTempFile)); // pass temp file 
startActivityForResult(intent, REQUEST_CODE_CAMERA); 

注:ファイルのウリはなりません

File tempFile = File.createTempFile("photo", ".jpg", context.getCacheDir()); 
tempFile.setWritable(true, false); 

今、あなただけのカメラの意図のための出力ファイルとしてこのファイルを渡す必要がありますActivityの結果であなたに渡された場合、tempFileへの参照を保持し、そこから取得する必要があります。

+0

マシュマロを標的とするときにはもう動かないようです。 – wiradikusuma

+0

このオプションは有望そうですが、誰も互換性に関するフィードバックをお持ちですか? – Zapnologica

+0

動作しません。カメラアプリはアプリキャッシュディレクトリにアクセスできません。 – Makalele

2

カメラアプリはあなたのアプリのプライベートディレクトリにアクセスできないため、写真ファイルをそのディレクトリに書き込む必要があります。これはあなたを与える

Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
File file = new File(getActivity().getApplicationContext().getExternalFilesDir(android.os.Environment.DIRECTORY_PICTURES).getAbsolutePath() + File.separator + "yourPicture.jpg"); 
Uri uri = Uri.fromFile(file); 
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, url); 

:これを試してみてください

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

:私はこれについては本当にわからないが、これは私の作品:

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

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
if (takePictureIntent.resolveActivity(getPackageManager()) != null) { 
    // Create the File where the photo should go 
    File photoFile = null; 
    try { 
     photoFile = createImageFile(); 
     takePictureIntent.putExtra("PhotoPath", mCameraPhotoPath); 
    } catch (IOException ex) { 
     // Error occurred while creating the File 
     Log.e(TAG, "Unable to create Image File", ex); 
    } 

    // Continue only if the File was successfully created 
    if (photoFile != null) { 
     takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, 
       Uri.fromFile(photoFile)); 
    } else { 
     takePictureIntent = null; 
    } 
} 

しかし、あなたはまだキットカットの前にWRITE_EXTERNAL_STORAGE許可が必要ですこの場合はカメラアプリに書き込み可能な「外部」ストレージにアクセスできますが、ファイルはアプリから見えます。 アンドロイドのストレージスペースについてもう少し詳しく知りたい方はhttps://www.youtube.com/watch?v=C28pvd2plBA

希望します。

+2

これは私がAndroid 6で壊れていないこれまでに見つけた唯一の実用的な解決策です:) –

+0

Working! WRITE_EXTERNAL_STORAGEまたはREAD_EXTERNAL_STORAGEの必要はありません。 – Makalele

+0

ありがとう! 'onActivityResult'では' RESULT_OK'と 'data == null'を取得します。この場合、パス(変数 'uri')からファイルを読み込むか、https://stackoverflow.com/questions/32043222/how-to-get-full-size-picture-and-thumbnail-from-を参照してください。同じ意図のカメラ。 API> = 23でファイルを読むための許可を得る必要があります。 – CoolMind

関連する問題