2015-11-11 6 views
36

के साथ काम नहीं कर रहा है मैं आउटपुट को अपने आंतरिक भंडारण में स्टोर करने के लिए कैमरा ऐप बनाने की कोशिश कर रहा हूं। मैं यह भी समझता हूं कि तृतीय पक्ष ऐप्स मेरे आवेदन के आंतरिक संग्रहण तक पहुंचने में सक्षम नहीं हैं लेकिन हम FileProvider के माध्यम से आंतरिक निर्देशिका को उजागर करके ऐसा करने में सक्षम हैं।फ़ाइलप्रोवाइडर कैमरा

मैं निम्नलिखित तरीके से मेरी 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 
); 

लेकिन यह केवल गठजोड़/विषैली गैस उपकरणों के लिए काम करेंगे। सैमसंग कैमरा ऐप एक अलग पैकेज नाम का उपयोग कर सकता है।

उत्तर

91
  1. कृपया के रूप में pskink द्वारा बताया exported="true" डाल करने के लिए कोशिश मत करो, अपने अनुप्रयोग पल लोड दुर्घटना होगा। FileProvider इस राज्य में काम करने के लिए नहीं है।

  2. द्वारा intent.addFlags समाधान का प्रयास किया। काम नहीं कर रहा। शायद केवल ACTION_SEND प्रकार के इरादे से काम करेगा।

  3. मुझे उत्तर in this post मिला। जाहिर है मैन्युअल अनुदान रास्ता ही एकमात्र समाधान है। लेकिन हम उम्मीदवार पैकेजों की सूची के माध्यम से हमेशा लूप कर सकते हैं और उन सभी को अनुदान अनुमति दे सकते हैं।

    List<ResolveInfo> resInfoList = context.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); 
    for (ResolveInfo resolveInfo : resInfoList) { 
        String packageName = resolveInfo.activityInfo.packageName; 
        context.grantUriPermission(packageName, uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION); 
    } 
    
+3

बहुत संतोषजनक हैक :) –

+26

'एडफ्लैग()' एंड्रॉइड 5.0+ पर काम करता है। पुराने उपकरणों पर, आपके दृष्टिकोण की आवश्यकता है। नमूना के लिए https://github.com/commonsguy/cw-omnibus/tree/master/Camera/FileProvider देखें। – CommonsWare

+2

मुझे यहां कोई संदेह है। मुझे एंड्रॉइड के बहुत कम ज्ञान के लिए खेद है, लेकिन मैं उलझन में हूं। कैमरा लॉन्च करने से पहले, मैं निर्देशिका को "Environment.getExternalStoragePublicDirectory ( पर्यावरण .DIRECTORY_PICTURES") के रूप में सेट कर रहा हूं। क्या मुझे अभी भी FileProvider का उपयोग करने की आवश्यकता है या क्या यह केवल निजी ऐप क्षेत्र में संग्रहीत छवियों के लिए उपयोग किया जाता है? – AndroidGuy

0

मैं ने वही समस्या थी, लेकिन बाद में मैं अपने कोड लिखने में कोई गलती है करने के लिए यह पता लगाना। टाइपो AndroidManifest.xml में था, ठीक उसी पंक्ति में "अधिकारियों" टैग में टैग में था।

मेरे लिए

,

android:authorities="com.stackoverflow.test.camerawithfileprovider.fileprovider" 

काम नहीं करता है (जब मैं कैमरे के उदाहरण ऐप्लिकेशन क्रैश कहते हैं), लेकिन अगर मैं "फाइल" हटा सकते हैं और कि स्ट्रिंग की जगह निम्नलिखित के रूप में:

android:authorities="com.stackoverflow.test.camerawithfileprovider.provider" 

मेरा ऐप सुचारू रूप से चलता है (ऐप फोटो लेता है, इसे स्टोर करता है, और क्लाइंट ऐप में गतिविधि को पूर्वावलोकन देता है)।

क्या आपके ऐप में भी एक ही समस्या है?

संबंधित मुद्दे