15

Tôi đã cố gắng theo dõi Android tutorial trên các tệp chia sẻ. tôi thiết lập các FileProvider như thế này:IllegalArgumentException: Không thể tìm thấy cấu hình gốc chứa xxx trên FileProvider.getUriForFile

Trên xml biểu hiện chính:

<provider 
      android:name="android.support.v4.content.FileProvider" 
      android:authorities="com.example.mysecondapp.fileprovider" 
      android:exported="false" 
      android:grantUriPermissions="true" > 
      <meta-data 
       android:name="android.support.FILE_PROVIDER_PATHS" 
       android:resource="@xml/filepaths" /> 
     </provider> 

file res/xml/filpaths.xml:

<paths xmlns:android="http://schemas.android.com/apk/res/android"> 
    <external-path name="myexternalimages" path="SpCars_album/" /> 
</paths> 

Và trong mã của tôi, tôi đang cố gắng như sau:

File requestFile = new File(mImageFilenames[position]); 
       try { 
        fileUri = FileProvider.getUriForFile(
          SeventhActivity.this, 
          "com.example.mysecondapp.fileprovider", 
          requestFile); 
       } catch (IllegalArgumentException e) { 
        Log.e("File Selector", 
          "The selected file can't be shared: " + 
            mImageFilenames[position]); 
       } 

RequestFile được khởi tạo với đúng đường dẫn làm việc cho một tệp. Đường dẫn của tệp đó bắt đầu chính xác với những gì getExternalFilesDir(Environment.DIRECTORY_PICTURES) trả về. Tôi không thể hiểu điều gì làm tăng lỗi vì mọi thứ dường như phù hợp. Cảm ơn trước.

+1

bạn có thể cung cấp đầu ra logcat hoàn chỉnh không? – bbuecherl

+0

Đây là bản ghi đầy đủ: http://pastebin.com/xbyMewHc – AndroidNewbie

Trả lời

22

Đường dẫn của tệp đó bắt đầu chính xác với những gì getExternalFilesDir (Environment.DIRECTORY_PICTURES) trả về.

AFAIK, thư này sẽ không cung cấp cho bạn một thư mục có tên SpCars_album/.

Tôi không thể hiểu điều gì làm tăng lỗi vì mọi thứ có vẻ phù hợp.

Tệp bạn đã cung cấp không phải là tệp bạn có thể phục vụ theo số FileProvider từ gốc đã xác định của bạn.


CẬP NHẬT

Tôi quên rằng đây được gắn với a documentation bug on FileProvider. FileProvider<external-path> không NOT phân phát tệp từ getExternalFilesDir(), nhưng thay vì từ Environment.getExternalStorageDirectory(). Tôi đã tạo a StreamProvider subclass that offers support for getExternalFilesDir().

Nếu bạn sử dụng StreamProvider, thay thế <external-path> bằng <external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />, bạn sẽ có may mắn hơn.

+0

Sau đó giả định rằng các tệp tôi muốn phân phối có trong đường dẫn sau: '/storage/emulated/0/Android/data/com.example. mysecondapp/files/Pictures/SpCars_Album/' Tôi nên chỉ định những gì trong tệp xml filepaths của mình? – AndroidNewbie

+0

@AndroidNewbie: Xem câu trả lời được cập nhật. – CommonsWare

+0

Cảm ơn bạn rất nhiều – AndroidNewbie

8

Đây là câu hỏi cũ, nhưng tôi vừa gặp sự cố tương tự.

Một giải pháp lười biếng tôi thấy là chỉ cần sử dụng:

<external-path name="myexternalimages" path="Android/" /> 

Bởi vì lợi nhuận getExternalStorageDirectory "/ lưu trữ/mô phỏng/0 /", chia sẻ/Android (cấp độ tiếp theo xuống) sẽ cho phép bất kỳ tập tin có trong ứng dụng của bạn sẽ được truy cập.

Ngoài ra, nếu bạn muốn được chính xác hơn, bạn có thể làm điều này:

<external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" /> 

này không cảm thấy hoàn toàn đúng, nhưng nó dường như làm việc!

+0

Đẹp hack ,, nhưng siêu không an toàn !!! –

+0

@eAj: Làm việc như một sự quyến rũ - IOU bia – Chepech

+0

Chờ một giây, người dùng rõ ràng muốn sử dụng ** getExternalFilesDirs **, NOT ** getExternalStorageDirectory **. Vậy tại sao chúng ta nên xác định '' thay vì ''? –

-6

nếu bạn không thử bắt ngoại lệ như IllegalArgumentException cho FileProvider.getUriFoFile(), khi bạn chạy mã của mình, bạn cũng sẽ có ngoại lệ này.

try { 
    Uri uriForFile = FileProvider.getUriForFile(this,"com.fengfutong.bluetoothc2s.fileprovider", f); 
} catch (IllegalArgumentException e) { 
    e.printStackTrace(); 
} 
Các vấn đề liên quan