FileProvider - IllegalArgumentException: Yapılandırılmış kök bulunamadı


233

Kamera ile fotoğraf çekmeye çalışıyorum, ancak aşağıdaki hatayı alıyorum:

FATAL EXCEPTION: main
Process: com.example.marek.myapplication, PID: 6747
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Android/data/com.example.marek.myapplication/files/Pictures/JPEG_20170228_175633_470124220.jpg
    at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:711)
    at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:400)
    at com.example.marek.myapplication.MainActivity.dispatchTakePictureIntent(MainActivity.java:56)
    at com.example.marek.myapplication.MainActivity.access$100(MainActivity.java:22)
    at com.example.marek.myapplication.MainActivity$1.onClick(MainActivity.java:35)

AndroidManifest.xml:

<provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="com.example.marek.myapplication.fileprovider"
        android:enabled="true"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
</provider>

Java:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        File photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            Toast.makeText(getApplicationContext(), "Error while saving picture.", Toast.LENGTH_LONG).show();
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            Uri photoURI = FileProvider.getUriForFile(this,
                    "com.example.marek.myapplication.fileprovider",
                    photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }

file_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="my_images" path="images/"/>
</paths>

Bütün gün bu hatayı araştırıyordum ve anlamaya çalışıyordum FileProvider, ama bu hata mesajının bana ne anlatmaya çalıştığı hakkında hiçbir fikrim yok. Daha fazla bilgi / kod istiyorsanız, yorumda bana yazın.


2
Ayrıca createImageFile yöntem kodunu yapıştırabilir misiniz?
Ankit Batra

Çok üzgünüm, ama bu projeyi iptal ettim ve artık üzerinde çalışmıyorum . Bu soruyu "kapatmak" için en sevdiğim yanıtı kabul edeceğim. Katılım için herkese teşekkürler ve umarım başkalarına yardımcı olur.
Pivoman

Aynı sorunla karşılaştı. Temel bir FileProvider kurulumunu minimal github örnek projesi kullanarak elde etmek için bu çözümü buldunuz: stackoverflow.com/a/48103567/2162226 . Bu dosyalar yerel bir bağımsız projeye (değişiklik yapmadan) kopyalamak için hangi adımları sağlar
Gen Bo

Bu sorun şimdi Delphi
10.4'te

Yanıtlar:


211

Dosyanız altında depolanır getExternalFilesDir(). Bu eşleşir <external-files-path>, değil <files-path>. Ayrıca, dosya yolunuzda içermiyor images/, bu nedenle pathXML'nizdeki özellik geçersiz.

Şununla değiştir res/xml/file_paths.xml:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="my_images" path="/" />
</paths>

GÜNCELLEME 2020 13 MART

Aşağıdaki gibi belirli bir yol için sağlayıcı yolu:

  • <files-path/> -> Context.getFilesDir()
  • <cache-path/> -> Context.getCacheDir()
  • <external-path/> -> Environment.getExternalStorageDirectory()
  • <external-files-path/> -> Context.getExternalFilesDir(String)
  • <external-cache-path/> -> Context.getExternalCacheDir()
  • <external-media-path/> -> Context.getExternalMediaDirs()

Ref: https://developer.android.com/reference/androidx/core/content/FileProvider


5
Tamam, harici dosya yolu ekledim, ama yine de aynı hata var: / Belki daha fazla hata var. Emülatör android cihazı kullanıyorum, o klasörü falan mı oluşturmak zorundayım?
Pivoman

22
"'path' özniteliği tanımlanmalıdır." Burada yapılandırmada yol eksik.
blackjack

1
Android 5'te birden çok yolla ilgili bir sorun
yaşıyordum

3
Bunun aynı olduğunu düşündüğüm bir kilitlenme raporu aldım (50-100 cihazdan sanırım). <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>En path="."üst düzeyde kalmak için kendi araştırmamda bulduğum şey bu. FileProvider'ı daha yakından incelerseniz, XML'den okunan yolun standartlaştırıldığını görürsünüz. En iyi tahminim ContextCompat#getExternalFilesDirsnull @line 616 (v26.0.1) döndürdü, bu yüzden bir PathStrategy kaydedilmedi. Bu Huawei cihazında meydana geldi.
androidguy

10
<External-files-path kullanmak yerine <external-path denedim ve çalıştı.
Güvenli

166

Bu, herkesin sorununu çözebilir: Klasörler yolu hakkında endişelenmenize gerek kalmadan tüm etiketler eklenir. Res / xml / file_paths.xml ile değiştirin:

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path
    name="external"
    path="." />
  <external-files-path
    name="external_files"
    path="." />
  <cache-path
    name="cache"
    path="." />
  <external-cache-path
    name="external_cache"
    path="." />
<files-path
    name="files"
    path="." />
</paths>

3
En iyi çözüm. Teşekkürler.
Pawan Pillai

1
Basit bir çözüm ... ama bu harika için! Bir sağlayıcı kullandım sonra hedef dizini değiştirmek için kullanıcı imkanı girdim ... hiçbir şey artık çalıştı çünkü o noktada sağlayıcı dinamik olmalı .... benim gün kurtardı!
Bronz

1
Bu çözümü kullandı ve kod çalışmaya başladı. Bunlardan hangisinin çalıştığını test ederek gereksiz kod kaldırıldı
Kartik

1
Dostum günümü kurtardın. Çok teşekkürler :-)
manjunath kallannavar

1
Harika benim için çalıştı, yeni bir öğrenci olarak dış dosyalardan değil de önbellekten almadığımı fark etti
Tony Merritt

82

Etkin tatlar sonra (dev, sahne) benzer bir sorun var.

Tatlar önce benim yol kaynak şöyle görünüyordu:

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
    name="my_images"
    path="Android/data/pl.myapp/files/Pictures" />
</paths>

Eklenen android: yetkililer = Manifest uygulamasındaki "$ {applicationId} .fileprovider" pl.myapp.dev veya pl.myapp.stage lezzete bağlı ve uygulama çökmeye başladı. Tam yolu kaldırdım ve yerine nokta koydum ve her şey çalışmaya başladı.

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="my_images"
        path="." />
</paths>

7
Benim için çalıştı. Teşekkürler! '' İle nasıl geldin. gösterim?
NightFury

2
@antygravity bu çözüm için referans / dokümantasyon sağlayabilir misiniz?
geekoraul

7
Bu çözümün olumsuz sonuçları var mı?
RediOne1

Benim için çalıştı, çok teşekkürler.
Hiren

Bu kabul edilen cevap olmalı! Çalışan tek çözüm
egorikem

43

Dahili önbellek kullanıyorsanız kullanın.

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

3
teşekkürler, durumum: / data / data / pkg_name / files içine kaydedilmiş bir uygulama yüklemek istiyorum, bu yüzden doğru yapılandırmam aşağıdaki gibi yapılandırın: <files-path name = "files" path = "/" />
aolphn

25

Bir çözüm bulmaya çalışırken 2 hafta kaybettim ... Yukarıdaki her şeyi denedikten sonra buraya gelirseniz:

1 - Etiket sağlayıcınızın etiket uygulamasının içinde olup olmadığını kontrol edin

<application>

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

</application>

2 - Başarısız çok yol denerseniz, bunu test edin:

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <cache-path name="cache" path="." />
  <external-path name="external" path="." />

  <root-path name="root" path="." />
  <files-path name="my_images" path="/" />
  <files-path name="my_images" path="myfile/"/>
  <files-path name="files" path="." />

  <external-path name="external_files" path="." />
  <external-path name="images" path="Pictures" />
  <external-path name="my_images" path="." />
  <external-path name="my_images" path="Android/data/com.companyname.yourproject/files/Pictures" />
  <external-path name="my_images" path="Android/data/com.companyname.yourproject/files/Pictures/" />

  <external-files-path name="images" path="Pictures"/>
  <external-files-path name="camera_image" path="Pictures/"/>
  <external-files-path name="external_files" path="." />
  <external-files-path name="my_images" path="my_images" />

  <external-cache-path name="external_cache" path="." />

</paths>

Kamera çalışıyorsa bunu test edin, ardından bazı hatları ortadan kaldırın ve test etmeye devam edin ...

3 - Emülatörünüzde kameranın etkin olup olmadığını kontrol etmeyi unutmayın.


1
Teşekkürler, bu benim için çalıştı. Diğer yolları kaldırmak gerekli mi?
CodeSlave

22

Eminim partiye geç kaldım ama aşağıda benim için çalıştı.

<paths>
    <root-path name="root" path="." />
</paths>

Bu benim kod da işe almak için son adımdı! Teşekkürler.
Dog Dogma

15

Bu beni biraz karıştırıyor.

Sorun xml dosyanızdaki "yol" özelliğindedir.

Bu belgeden FileProvider 'yolu' bir alt dizindir , ancak başka bir belgede (kamera / fotoğraf temelleri) gösterilen 'yol' tam yoldur.

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="Android/data/com.example.package.name/files/Pictures" />
</paths>

Bu 'yolu' tam yol olarak değiştiriyorum ve sadece işe yarıyor.


15

Geç kalırdım ama bunun için bir çözüm buldum. Benim için iyi çalışıyor, sadece XML dosyasını şu yollarla değiştirdim:

 <?xml version="1.0" encoding="utf-8"?>
<paths>
    <root-path name="root" path="." />
</paths>

1
Benim için bu provider_paths.xmlbir inceleme uyarısı verir "Burada öğe kök yoluna izin verilmez".
Luis A. Florit

15

Harici yolun ikincil depolama biriminizi, yani "çıkarılabilir depolama birimini" ("harici" adına rağmen) göstermediğini unutmayın. "Yapılandırılmış kök bulunamadı" mesajı alıyorsanız, bu satırı XML dosyanıza ekleyebilirsiniz.

<root-path name="root" path="." />

Daha fazla ayrıntı için buraya bakın FileProvider ve ikincil harici depolama


14

Cihazınızın kaç depolama alanı sunduğunu kontrol edin - ikincil depolama alanından dosya paylaşımı desteklenmez. FileProvider.javaKaynağa bakın ( support-core-utils 25.3.1'den ):

            } else if (TAG_EXTERNAL_FILES.equals(tag)) {
                File[] externalFilesDirs = ContextCompat.getExternalFilesDirs(context, null);
                if (externalFilesDirs.length > 0) {
                    target = externalFilesDirs[0];
                }
            } else if (TAG_EXTERNAL_CACHE.equals(tag)) {
                File[] externalCacheDirs = ContextCompat.getExternalCacheDirs(context);
                if (externalCacheDirs.length > 0) {
                    target = externalCacheDirs[0];
                }
            }

Yani, sadece ilk depolamayı alırlar.

Ayrıca, arayüz getExternalCacheDirs()üzerinden depoların listesini elde etmek için kullanıldığını görebilirsiniz ContextCompat. Sınırları için belgelere bakın (örneğin USB Flaşları tanımaması söylenir). En iyisi, bu API'dan depoların listesinin hata ayıklama çıktısını kendi başınıza yapmaktır, böylece depolama yolunun geçilen yolla eşleştiğini kontrol edebilirsiniz getUriForFile().

Google'ın sorun izleyicisinde birden fazla depolama alanını desteklemeyi isteyen bir bilet zaten (06-2017 için olduğu gibi) var. Sonunda, bu konuda da SO sorusu buldum .


1
Bu derin cevap daha fazla oy almalıdır. FileProvider'ın gerçekte hangi harici depolamayı tanıdığını araştırdığınız için teşekkür ederiz.
LarsH

10

Bunun için 5 saat geçirdim ..

Yukarıdaki tüm yöntemleri denedim, ancak uygulamanızın şu anda hangi depolamayı kullandığına bağlı.

https://developer.android.com/reference/android/support/v4/content/FileProvider#GetUri

Kodları denemeden önce belgeleri kontrol edin.

Benim durumumdan beri files-pathalt dizin olacak Context.getFilesDir(). İşin garip yanı, Context.getFilesDir()bir başka alt dizine dikkat çekmesidir.

aradığım şey

data/user/0/com.psh.mTest/app_imageDir/20181202101432629.png

Context.getFilesDir()

İadeler /data/user/0/com.psh.mTest/files

yani etiket olmalı

....files-path name="app_imageDir" path="../app_imageDir/" ......

Sonra çalışıyor !!


1
Belgelere başvurduğunuz için teşekkür ederiz. Beni doğru cevaba götürdü. Benim durumumda dosyam kaydedildi getExternalStorageDirectory()ve <external-path>bunun yerine etiketi olan yolu sağlamam gerekiyordu<files-path>
alierdogan7

Dosyalar yolundaki bu özel yanıt için teşekkür ederiz. Çok yardımcı oldu. :)
arungiri_10

Evet çalışıyor!!! kilit nokta, yolun başında ".." belirtmektir, bu yol gibi = "../ myDirectory /"
Robert Apikyan

9

Bunların hiçbiri benim için işe yaramadı. İşe yarayan tek yaklaşım xml'de açık bir yol bildirmemek. Bunu yapın ve mutlu olun:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="my_images" path="." />
</paths>

Burada da bu soru hakkında mükemmel bir öğretici var: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s


7

Benim sorunum, gibi farklı türler için dosya yollarında çakışan isimler vardı:

<cache-path
    name="cached_files"
    path="." />
<external-cache-path
    name="cached_files"
    path="." />

İsimleri ("cached_files") benzersiz olarak değiştirdikten sonra hatadan kurtuldum. Benim tahminim, bu yollar bazı HashMap veya yinelenen izin vermeyen bir şey saklanır.


3

Bunu çözmek için ne yaptım -

AndroidManifest.xml

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

filepaths.xml (FileProvider uygulamasının uygulamanın harici dosyalar dizini içindeki tüm dosyaları paylaşmasına izin verme)

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-files-path name="files"
        path="/" />
</paths>

ve java sınıfında -

Uri fileProvider = FileProvider.getUriForFile(getContext(),"com.mydomain.fileprovider",newFile);

3

Bu benim için de çalıştı.Tam yol vermek yerine path = "Pictures" verdim ve iyi çalıştı.

<?xml version="1.0" encoding="utf-8"?>
 <paths>
  <external-files-path
    name="images"
    path="Pictures">
  </external-files-path>
 </paths>

2

Ne tür bir depolama yapmak istediğinize bağlıdır, DAHİLİ veya HARİCİ

DIŞ DEPOLAMA için

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="my_images" path="my_images" />
</paths>

ancak DAHİLİ DEPOLAMA için, yola dikkat edin, çünkü dosyanızın uygulamanın kök dizininde ("/") bulunacağı anlamına gelen getFilesDir () yöntemini kullanır

  File storeDir = getFilesDir(); // path "/"

Bu nedenle sağlayıcı dosyanız şu şekilde olmalıdır:

<paths>
    <files-path name="my_images" path="/" />
</paths>

Tüm örnekler, kullanıcının harici depolama alanı kullandığını varsayar. Dahili depolama konusunda yardıma ihtiyacım vardı ve bu cevabı bulmak saatler sürdü. Teşekkür ederim.
zeeshan

2

Yukarıdakilerin hiçbiri benim için işe yaramadı, birkaç saat hata ayıklamadan sonra sorunun olduğunu tespit ettim createImageFile(), özellikle absolute pathvsrelative path

Fotoğraf çekmek için resmi Android kılavuzunu kullandığınızı varsayıyorum. https://developer.android.com/training/camera/photobasics

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

        // Save a file: path for use with ACTION_VIEW intents
        mCurrentPhotoPath = image.getAbsolutePath();
        return image;
    }

Dikkat edin storageDir, bu dosyanın oluşturulacağı konumdur. Bu dosyanın mutlak yolunu elde etmek için sadece kullanıyorum image.getAbsolutePath(), onActivityResultfotoğraf çektikten sonra Bitmap görüntüsüne ihtiyacınız varsa bu yol kullanılacak

aşağıda, mutlak yolu kullanması için file_path.xmlkullanın.

<paths>
    <external-path
        name="my_images"
        path="." />
</paths>

ve fotoğraf çektikten sonra bitmap'e ihtiyacınız varsa

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Bitmap bmp = null;
        try {
            bmp = BitmapFactory.decodeFile(mCurrentPhotoPath);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

2

Bu hatayı alıyordum Failed to find configured root that contains...

Aşağıdaki geçici çözüm sorunumu çözdü

res / xml / file_paths.xml

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

AndroidManifest.xml

<provider
      android:name="android.support.v4.content.FileProvider"
      android:authorities="[PACKAGE_NAME]"
      android:exported="false"
      android:grantUriPermissions="true">
         <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths">
         </meta-data>
</provider>

ActivityClass.java

void shareImage() {
        Intent intent = new Intent(Intent.ACTION_SEND);
        intent.setType("image/*");
        intent.putExtra(Intent.EXTRA_STREAM, FileProvider.getUriForFile(this,"com.slappstudio.pencilsketchphotomaker", selectedFilePath));
        startActivity(Intent.createChooser(intent,getString(R.string.string_share_with)));
    }

1

Android resmi belgesi, file_paths.xml dosyasının şunları içermesi gerektiğini söylüyor:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">   
    <external-path name="my_images"    
        path="Android/data/com.example.package.name/files/Pictures" />
</paths>

Ama en son android çalışmak için yolun sonunda bir "/" olmalı, şöyle:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">   
    <external-path name="my_images"    
        path="Android/data/com.example.package.name/files/Pictures/" />
</paths>

1

Xml file_paths dosyasındaki aşağıdaki değişiklik benim için çalıştı.

 <external-files-path name="my_images" path="Pictures"/>
 <external-files-path name="my_movies" path="Movies"/>

1

Aynı sorunu vardı, çalışması için aşağıdaki kodu denedim.

1. Xml dosyası oluşturun: sağlayıcı_yolları

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="my_images" path="myfile/"/>
</paths>

2. Mainfest dosyası

 <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.ril.learnet.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
 </provider>

3. Java dosyanızda.

      File file =  new File(getActivity().getFilesDir(), "myfile");
        if (!file.exists()) {
            file.mkdirs();
        }
        String  destPath = file.getPath() + File.separator + attachmentsListBean.getFileName();

               file mfile = new File(destPath);
                Uri path;
                Intent intent = new Intent(Intent.ACTION_VIEW);
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
                {
                    path = FileProvider.getUriForFile(AppController.getInstance().getApplicationContext(), AppController.getInstance().getApplicationContext().getPackageName() + ".provider", mfile );
                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                } else {
                    path = Uri.fromFile(mfile);
                }
   intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    intent.setDataAndType(path, "image/*");
                    getActivity().startActivity(intent);

1

Hiçbir şey yardımcı olmazsa ve hatayı alıyorsanız

failed to find configured root that contains /data/data/...

sonra aşağıdaki gibi bir satırı değiştirmeyi deneyin:

File directory = thisActivity.getDir("images", Context.MODE_PRIVATE);

için:

File directory = new File(thisActivity.getFilesDir(), "images");

ve xml dosyasında:

<files-path name="files" path="." />

bu garip, çünkü eriştiğim klasör /images.


.GetDir'den .getFilesDir'e geçiş bana yardımcı oldu. Teşekkürler!
Dmitriy Pavlukhin

1

Sorunum Yanlış Dosya Adı : Ben file_paths.xmlkaynak provider_paths.xmlManifest olarak ayarlanırken res / xml altında oluşturun :

<provider
        android:authorities="ir.aghigh.radio.fileprovider"
        android:name="android.support.v4.content.FileProvider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths"/>
    </provider>

Değiştim provider_pathsiçin file_pathsve problem çözüldü.


1

Dosya yolunuz / storage / emulated / 0 / "yourfile"

sadece FileProvider xml'nizi değiştirmeniz yeterlidir

<paths>
    <external-path name="external" path="." />
</paths>

sonra dosya paylaşmanız gerektiğinde bu işlevi çağırın

Intent sharingIntent = new Intent(Intent.ACTION_SEND);
                    Uri fileUri = FileProvider.getUriForFile(getContext(),
                            "com.example.myapp.fileprovider",
                            file);
                    sharingIntent.setType("*/*"); // any flie type
                    sharingIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
                    startActivity(Intent.createChooser(sharingIntent, "Share file"));

android M ~ Pie üzerinde çalışır


Bu çalışıyor! Ama neden path = "kullandığımızı açıklayabilir misiniz?" path = "DCIM" yerine "Pictures" ...?
Hoang Lam

@Hoang Lam Fark, bir dizin belirtmeniz gerekip gerekmediğidir, örneğimde hepsine erişebilirsiniz
tembel

0

Görüyorum ki en azından file_paths.xml dosyasındaki diğer yollarla aynı yolu sunmuyorsunuz. Bu nedenle, aşağıdakiler de dahil olmak üzere 3 yerde tam olarak aynı paket adını veya yolunu sağladığınızdan emin olun:

  • android:authorities manifest'teki özellik
  • path file_paths.xml dosyasındaki öznitelik
  • authority argümanı FileProvider.getUriForFile () çağrılırken.

0
  • İçin Xamarin.Android kullanıcıları

Bu, Android 7.1, 8.0 ve sonraki sürümlerini hedeflerken destek paketlerinizi güncellememenizin bir sonucu olabilir. Bunları v25.4.0.2 + olarak güncelleyin ve bu hata ortadan kalkabilir (file_path dosyanızı başkalarının belirttiği gibi doğru şekilde yapılandırmış olursunuz).


Bağlamını verilmesi: Ben hedeflemesine geçiş Oreo dan koz helvası bir de Xamarin.Forms uygulaması ve bir resim çekmeden Xam.Plugin.Media yukarıdaki hata mesajı ile başarısız başladı, bu yüzden paket güncelleme tamam benim için hile yaptı.


0

path.xmlDosyayla ilgili ilke veya davranışın Destek Kitaplığı 26 ile 27 arasında değiştiğini fark ettim . Kameradan fotoğraf çekmek için aşağıdaki değişiklikleri gördüm:

  • 26 ile birlikte <external-path>ve pathargümanda verilen tam yolu kullanmak zorunda kaldım .

  • 27 ile tartışmayı <external-files-path>sadece alt klasörü kullanmak zorunda kaldım path.

path.xmlDosya olarak Destek Kütüphanesi 27 ile benim için özel olarak çalışan şey

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path name="camera_image" path="Pictures/"/>
</paths>

0

Merhaba Arkadaşlar Bunu Deneyin

Bu Kodda

1) Manifest'te 2 Dosya Sağlayıcısı Nasıl Bildirilir.

2) Dosya İndirme için İlk Sağlayıcı

3) kamera ve gallary için kullanılan ikinci Sağlayıcı

AŞAMA 1

     <provider
        android:name="android.support.v4.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/provider_paths" />
    </provider>

Provider_paths.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path name="apks" path="." />
</paths>

İkinci Sağlayıcı

     <provider
        android:name=".Utils.MyFileProvider"
        android:authorities="${applicationId}.provider"
        android:exported="false"
        android:grantUriPermissions="true"
        tools:replace="android:authorities"
        tools:ignore="InnerclassSeparator">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_path" />
    </provider>

file_path.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path name="storage/emulated/0" path="."/>
</paths>

.Utils.MyFileProvider

Sınıf Oluştur MyFileProvider (yalnızca herhangi bir yöntem bildirmek için sınıf oluştur)

Dosya Sağlayıcısı'nı kullandığınızda (.fileprovider) bu ad ve resim (.provider) için kullandığınızda bu kullanılır.

Herhangi biri varsa Bu kodu anlamak için sorun rp1741995@gmail.com üzerinde irtibata geçebilirsiniz size yardımcı olacaktır.


0

Sorun sadece xml yolu olmayabilir.

Benim düzeltmem aşağıdadır:

Kök kursuna bakıldığında android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile():

    public File getFileForUri(Uri uri) {
        String path = uri.getEncodedPath();

        final int splitIndex = path.indexOf('/', 1);
        final String tag = Uri.decode(path.substring(1, splitIndex));
        path = Uri.decode(path.substring(splitIndex + 1));

        final File root = mRoots.get(tag); // mRoots is parsed from path xml
        if (root == null) {
            throw new IllegalArgumentException("Unable to find configured root for " + uri);
        }

        // ...
    }

Bu mRoots, istenen uri etiketini içermelidir. Bu yüzden mRootsuri yazdırmak ve etiketlemek için bazı kodlar yazıyorum ve sonra kolayca eşleşmeyen etiketleri buluyorum .

Bu, sağlayıcı yetkisini ${applicationID}.provideraptalca bir fikir olarak belirlediği ortaya çıkıyor ! Bu yetki o kadar yaygındır ki, yol yapılandırmasını bozacak diğer sağlayıcılar tarafından kullanılabilir!


-1

File_paths.xml dosyasının xml dosyasını

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <files-path name="my_images" path="images/"/>
</paths>

için

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <fexeternal-path name="my_images" path="Android/data/com.example.marek.myapplication/files/Pictures"/>
</paths>

1
Cevabınızı yukarıdan kopyalamış olmanıza rağmen, doğru bir şekilde yapılmadı. Lütfen cevabınızdaki yazma uyumsuzluğunu düzeltin.
Abhinav Saxena
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.