10

Tôi cần cho phép người dùng chụp ảnh (từ thư viện hoặc từ ứng dụng máy ảnh) bằng Android 6.0.Chụp ảnh mà không được phép với Android 6.0

Bởi vì tôi không cần phải kiểm soát camera, tôi muốn sử dụng một ý định như mô tả ở đây:

Tuy nhiên, nếu bạn không cần kiểm soát như vậy, bạn có thể chỉ cần sử dụng một ý định ACTION_IMAGE_CAPTURE để yêu cầu một hình ảnh. Khi bạn bắt đầu ý định, người dùng được nhắc chọn ứng dụng máy ảnh (nếu chưa có ứng dụng máy ảnh mặc định) và ứng dụng đó sẽ chụp ảnh. Ứng dụng máy ảnh trả về ảnh cho phương thức onActivityResult() của ứng dụng của bạn.

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

Nhưng đối với này ACTION_IMAGE_CAPTURE, bạn cần phải điền vào thêm "MediaStore.EXTRA_OUTPUT" mà là một Uri vào một tập tin tạm thời (không param này, tôi sẽ chỉ có một thumbnail) . Tệp tạm thời này phải nằm trong bộ nhớ ngoài (để có thể truy cập bằng ứng dụng máy ảnh). Bạn cần có sự cho phép WRITE_EXTERNAL_STORAGE để tạo tệp trên bộ nhớ ngoài.

Vì vậy, nó không thể chụp ảnh thông qua các hộp thoại có nguồn gốc/ứng dụng mà không có sự cho phép android.permission.CAMERA hoặc android.permission.WRITE_EXTERNAL_STORAGE. Đúng không?

Cảm ơn

+0

Bạn có thể thử chuyển một 'nội dung: //' 'Uri' vào' EXTRA_OUTPUT' trỏ đến một 'Trình cung cấp nội dung' mà bạn viết, nơi bạn có thể chấp nhận dữ liệu. Tôi đã không cố gắng này, và tôi đoán là sẽ có một loạt các ứng dụng máy ảnh mà sẽ không được mong đợi một giá trị như vậy và sẽ bị nghẹt thở trên nó. – CommonsWare

+0

Bạn có bao giờ tìm được một công việc để làm việc này không? – AndroidEnthusiast

Trả lời

4

Có thể nếu bạn trên 4.4+ Android, bạn có thể chỉ định MediaStore.EXTRA_OUTPUT, trở thành một tập tin dưới gói cụ thể thư mục của bạn

Bắt đầu từ Android 4.4, chủ sở hữu, nhóm và chế độ tệp trên thiết bị lưu trữ bên ngoài hiện được tổng hợp dựa trên cấu trúc thư mục . Điều này cho phép các ứng dụng quản lý các thư mục dành riêng cho từng gói cụ thể trên bộ nhớ ngoài mà không yêu cầu chúng giữ quyền truy cập rộng WRITE_EXTERNAL_STORAGE. Ví dụ: ứng dụng có gói tên com.example.foo hiện có thể tự do truy cập Android/data/com.example.foo/trên thiết bị lưu trữ bên ngoài không có quyền . Các quyền tổng hợp này được thực hiện bằng cách gói các thiết bị lưu trữ thô trong một trình nền FUSE.

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

+0

Bạn đã thực sự thử điều này chưa? Điều này cho phép ứng dụng của bạn truy cập vào thư mục, chứ không phải ứng dụng CAMERA, đó là vấn đề. –

+0

@Derek Fung bạn có thể chia sẻ một dự án mẫu không? –

+0

Máy ảnh không có quyền truy cập vào thư mục dir thư mục riêng tư của ứng dụng. Giải pháp của @Jonathan Aste đang hoạt động. – Makalele

1

Điều này có thể không có một trong các CAMERAWRITE_EXTERNAL_STORAGE quyền.

Bạn có thể tạo tạm thời trong thư mục bộ nhớ cache của ứng dụng và cấp cho các ứng dụng khác quyền truy cập vào nó.Điều đó làm cho các tập tin ghi được bởi các ứng dụng máy ảnh:

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

Bây giờ bạn chỉ cần phải vượt qua tập tin này như các tập tin đầu ra cho mục đích camera:

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

Lưu ý: file Uri sẽ không được được chuyển cho bạn trong kết quả Hoạt động, bạn sẽ phải giữ một tham chiếu đến tempFile và lấy nó từ đó.

+0

Dường như không hoạt động nữa khi nhắm mục tiêu Marshmallow. – wiradikusuma

+0

tùy chọn này có vẻ đầy hứa hẹn, bất kỳ ai có bất kỳ phản hồi nào về tính tương thích? – Zapnologica

+0

Không hoạt động. Ứng dụng máy ảnh không có quyền truy cập vào thư mục bộ nhớ cache của ứng dụng. – Makalele

2

Vì ứng dụng máy ảnh không thể truy cập vào các thư mục riêng tư của ứng dụng của bạn, Nhiệm vụ ứng dụng của bạn là viết tệp ảnh vào thư mục đó. Tôi không thực sự chắc chắn về điều này nhưng công trình này cho tôi:

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; 
    } 
} 

Nhưng bạn vẫn cần WRITE_EXTERNAL_STORAGE phép trước khi KitKat:

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

Hãy thử điều này:

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); 

này mang đến cho bạn truy cập vào bộ nhớ "bên ngoài" có thể ghi được đối với ứng dụng máy ảnh trong trường hợp này, nhưng các tệp này chỉ hiển thị từ ứng dụng của bạn. Để tìm hiểu thêm một chút về không gian lưu trữ trong android, hãy xem https://www.youtube.com/watch?v=C28pvd2plBA

Hy vọng nó sẽ giúp bạn!

+2

Đây là giải pháp làm việc duy nhất tôi tìm thấy cho đến nay mà không phá vỡ trên Android 6. :) –

+0

Làm việc! Không cần WRITE_EXTERNAL_STORAGE hoặc READ_EXTERNAL_STORAGE. – Makalele

+0

Cảm ơn! Trong 'onActivityResult', bạn sẽ nhận được' RESULT_OK' và 'data == null'. Trong trường hợp này, bạn nên đọc một tập tin từ đường dẫn (biến 'uri'), hoặc xem https://stackoverflow.com/questions/32043222/how-to-get-full-size-picture-and-thumbnail-from- camera-in-the-cùng-intent. Bạn phải được phép đọc tệp trên API> = 23. – CoolMind

Các vấn đề liên quan