के साथ काम नहीं कर रहा है मैं आउटपुट को अपने आंतरिक भंडारण में स्टोर करने के लिए कैमरा ऐप बनाने की कोशिश कर रहा हूं। मैं यह भी समझता हूं कि तृतीय पक्ष ऐप्स मेरे आवेदन के आंतरिक संग्रहण तक पहुंचने में सक्षम नहीं हैं लेकिन हम FileProvider
के माध्यम से आंतरिक निर्देशिका को उजागर करके ऐसा करने में सक्षम हैं।फ़ाइलप्रोवाइडर कैमरा
- Camera Intent not saving photo
- https://developer.android.com/reference/android/support/v4/content/FileProvider.html
मैं निम्नलिखित तरीके से मेरी AndroidManifest.xml
निर्दिष्ट करें::
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.stackoverflow.test.camerawithfileprovider" >
<application>
<activity
...
</activity>
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.stackoverflow.test.camerawithfileprovider.fileprovider"
android:exported="false"
android:grantUriPermissions="true" >
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_path" />
</provider>
</application>
</manifest>
मैं /res/xml/
में file_provider_path.xml
नाम के एक xml फ़ाइल बनाया मैं गाइड यहाँ का पालन किया है:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="image_capture" path="public/" />
</paths>
यह मैं कैसे बना सकते हैं और कैमरा आशय कहते हैं:
private static final int CAMERA_REQUEST_CODE = 5000;
private static final String CAMERA_FP_AUTHORITY = "com.stackoverflow.test.camerawithfileprovider.fileprovider";
Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Context context = MainActivity.this;
File imagePath = new File(context.getFilesDir(), "public");
if (!imagePath.exists()) imagePath.mkdirs();
File newFile = new File(imagePath, "tmp.jpg");
Uri imageUri = FileProvider.getUriForFile(context, CAMERA_FP_AUTHORITY, newFile);
//context.grantUriPermission("com.google.android.GoogleCamera", imageUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
Log.d("YouQi", "Image URI Passing to Camera: " + imageUri.toString());
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intent, CAMERA_REQUEST_CODE);
जब मैं आवेदन चलाने के लिए, मैं प्राप्त कर सकते हैं Logcat परिणाम के नीचे:
11-11 20:07:39.581 18303-18303/com.stackoverflow.test.camerawithfileprovider D/YouQi: Image URI Passing to Camera: content://com.stackoverflow.test.camerawithfileprovider.fileprovider/image_capture/tmp.jpg
समय पर सही जब कैमरा बंद हो गया, मैंने नीचे दिया गया अपवाद:
com.google.android.GoogleCamera E/AndroidRuntime: FATAL EXCEPTION: main
com.google.android.GoogleCamera E/AndroidRuntime: Process: com.google.android.GoogleCamera, PID: 19420
com.google.android.GoogleCamera E/AndroidRuntime: java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord{42e44f70 19420:com.google.android.GoogleCamera/u0a83} (pid=19420, uid=10083) that is not exported from uid 10312
com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1465)
com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Parcel.readException(Parcel.java:1419)
com.google.android.GoogleCamera E/AndroidRuntime: at android.app.ActivityManagerProxy.getContentProvider(ActivityManagerNative.java:2882)
com.google.android.GoogleCamera E/AndroidRuntime: at android.app.ActivityThread.acquireProvider(ActivityThread.java:4544)
com.google.android.GoogleCamera E/AndroidRuntime: at android.app.ContextImpl$ApplicationContentResolver.acquireUnstableProvider(ContextImpl.java:2274)
com.google.android.GoogleCamera E/AndroidRuntime: at android.content.ContentResolver.acquireUnstableProvider(ContentResolver.java:1425)
com.google.android.GoogleCamera E/AndroidRuntime: at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:906)
com.google.android.GoogleCamera E/AndroidRuntime: at android.content.ContentResolver.openOutputStream(ContentResolver.java:669)
com.google.android.GoogleCamera E/AndroidRuntime: at android.content.ContentResolver.openOutputStream(ContentResolver.java:645)
com.google.android.GoogleCamera E/AndroidRuntime: at com.android.camera.PhotoModule.onCaptureDone(PhotoModule.java:1281)
com.google.android.GoogleCamera E/AndroidRuntime: at com.android.camera.PhotoModule$8.onClick(PhotoModule.java:593)
com.google.android.GoogleCamera E/AndroidRuntime: at android.view.View.performClick(View.java:4445)
com.google.android.GoogleCamera E/AndroidRuntime: at android.view.View$PerformClick.run(View.java:18446)
com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:733)
com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
com.google.android.GoogleCamera E/AndroidRuntime: at android.os.Looper.loop(Looper.java:136)
com.google.android.GoogleCamera E/AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5146)
com.google.android.GoogleCamera E/AndroidRuntime: at java.lang.reflect.Method.invokeNative(Native Method)
com.google.android.GoogleCamera E/AndroidRuntime: at java.lang.reflect.Method.invoke(Method.java:515)
com.google.android.GoogleCamera E/AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732)
com.google.android.GoogleCamera E/AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566)
com.google.android.GoogleCamera E/AndroidRuntime: at dalvik.system.NativeStart.main(Native Method)
क्या कोई यह समझाने में सहायता कर सकता है कि समस्या क्यों होती है? http://www.axzae.com/downloads/CameraWithFileProvider.zip
वैसे भी, एप्लिकेशन अगर मैं स्पष्ट रूप से निर्दिष्ट काम करेगा:: मैं मेरी समस्या का एक नमूना प्रोजेक्ट बनाया हुआ है
context.grantUriPermission(
"com.google.android.GoogleCamera",
imageUri,
Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION
);
लेकिन यह केवल गठजोड़/विषैली गैस उपकरणों के लिए काम करेंगे। सैमसंग कैमरा ऐप एक अलग पैकेज नाम का उपयोग कर सकता है।
बहुत संतोषजनक हैक :) –
'एडफ्लैग()' एंड्रॉइड 5.0+ पर काम करता है। पुराने उपकरणों पर, आपके दृष्टिकोण की आवश्यकता है। नमूना के लिए https://github.com/commonsguy/cw-omnibus/tree/master/Camera/FileProvider देखें। – CommonsWare
मुझे यहां कोई संदेह है। मुझे एंड्रॉइड के बहुत कम ज्ञान के लिए खेद है, लेकिन मैं उलझन में हूं। कैमरा लॉन्च करने से पहले, मैं निर्देशिका को "Environment.getExternalStoragePublicDirectory ( पर्यावरण .DIRECTORY_PICTURES") के रूप में सेट कर रहा हूं। क्या मुझे अभी भी FileProvider का उपयोग करने की आवश्यकता है या क्या यह केवल निजी ऐप क्षेत्र में संग्रहीत छवियों के लिए उपयोग किया जाता है? – AndroidGuy