ফাইলপ্রভাইডার - অবৈধ অরগমেন্ট এক্সেপশন: কনফিগার করা রুটটি ব্যর্থ


233

আমি ক্যামেরা দিয়ে একটি ছবি তোলার চেষ্টা করছি, তবে আমি নিম্নলিখিত ত্রুটিটি পেয়ে যাচ্ছি:

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)

Andro আইডি:

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

জাভা:

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>

আমি এই ত্রুটিটি সম্পর্কে পুরো দিন অনুসন্ধান করেছিলাম এবং বুঝতে চেষ্টা করছিলাম FileProvider, তবে এই ত্রুটি বার্তাটি আমাকে কী বলার চেষ্টা করে তা আমার কোনও ধারণা নেই। আপনি যদি আরও তথ্য / কোড চান তবে কমেন্টে আমাকে লিখুন।


2
আপনিও createImageFile পদ্ধতি কোড পেস্ট করতে পারেন?
অঙ্কিত বাতরা

আমি দুঃখিত, তবে আমি এই প্রকল্পটি বাতিল করে দিয়েছি এবং আমি এটি নিয়ে আর কাজ করছি না । আমি এই প্রশ্নের "বন্ধ" সবচেয়ে সর্বাধিক প্রিয় উত্তর গ্রহণ করব। অংশগ্রহণের জন্য সকলকে ধন্যবাদ এবং আমি আশা করি এটি অন্যকে সহায়তা করবে helps
পিভোম্যান

একই ইস্যুতে দৌড়ে গেল। একটি ন্যূনতম গিথুব উদাহরণ প্রকল্প ব্যবহার করে একটি বেসিক ফাইলপ্রাইডার সেটআপ পেতে এই সমাধানটি খুঁজে পেয়েছেন: stackoverflow.com/a/48103567/2162226 । এটি স্থানীয় স্ট্যান্ডেলোন প্রকল্পে কোন ফাইলগুলি (কোনও পরিবর্তন না করে) অনুলিপি করার জন্য পদক্ষেপগুলি সরবরাহ করে
জেন বো বো

এই ইস্যুটি এখন ডেলফি 10.4 এ স্থির করা হয়েছে: মানের. embarcadero.com/browse/RSP-26950
ডেভ নোটেজ

উত্তর:


208

আপনার ফাইলটি এর অধীনে সঞ্চিত getExternalFilesDir()। যে মানচিত্র <external-files-path>, না <files-path>। এছাড়াও, আপনার ফাইলের পাথ এতে অন্তর্ভুক্ত করে না images/, তাই pathআপনার এক্সএমএলে থাকা বৈশিষ্ট্যটি অবৈধ।

এর সাথে প্রতিস্থাপন করুন res/xml/file_paths.xml:

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

আপডেট 2020 মার্চ 13

অনুসরণ হিসাবে নির্দিষ্ট পাথের জন্য সরবরাহকারী পথ:

  • <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()

সূত্র: https://developer.android.com/reference/androidx/core/content/FileProvider


5
ঠিক আছে, আমি বাহ্যিক-ফাইল-পাথ যুক্ত করেছি, তবে আমার এখনও একই ত্রুটি রয়েছে: / সম্ভবত আরও বাগ রয়েছে। আমি এমুলেটর অ্যান্ড্রয়েড ডিভাইস ব্যবহার করছি, আমাকে কি সেই ফোল্ডারটি তৈরি করতে হবে বা অন্য কিছু?
পিভোমন

22
"'পাথ' বৈশিষ্ট্যটি সংজ্ঞায়িত করা উচিত" আমরা এখানে কনফিগারেশনে পাথটি অনুপস্থিত।
ব্ল্যাকজ্যাক

1
অ্যান্ড্রয়েড 5 এ একাধিক পাথ নিয়ে আমার সমস্যা ছিল 2.. 2 এর পরিবর্তে কেবল একটি পাথ
বাকি

3
আমি একটি ক্র্যাশ প্রতিবেদন পেয়েছি (50-100 ডিভাইসের মধ্যে, আমি মনে করি) যা এটির মতো। কি আমি আমার নিজের গবেষণা পাওয়া শীর্ষ স্তরে থাকতে হয়। আপনি যদি ফাইলপ্রভাইডারটি আরও ঘনিষ্ঠভাবে যান তবে আপনি দেখতে পাবেন যে এক্সএমএল থেকে পড়ার পথটি ক্যানোনিকালাইজড হয়ে গেছে। আমার সেরা অনুমানটি হ'ল নাল @ লাইন 616 (v26.0.1) প্রত্যাবর্তন হয়েছে, তাই কোনও পাথস্ট্রেজি নিবন্ধীকৃত হয়নি। এটি হুয়াওয়ে ডিভাইসে ঘটেছে। <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-files-path name="extfiles" path="."/> </paths>path="."ContextCompat#getExternalFilesDirs
অ্যান্ড্রয়েডগুই

10
<বাহ্যিক-ফাইল-পাথ ব্যবহার করার পরিবর্তে আমি <বাহ্যিক-পথ চেষ্টা করেছি এবং এটি কার্যকর হয়েছে।
নিরাপদ

166

এটি প্রতিটিের সমস্যার সমাধান করতে পারে: সমস্ত ট্যাগ যুক্ত করা হয়েছে যাতে আপনার ফোল্ডারগুলির পথ সম্পর্কে চিন্তা করার দরকার নেই। Res / xML / file_paths.xML এর সাথে প্রতিস্থাপন করুন:

<?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
সব থেকে ভালো সমাধান. ধন্যবাদ।
পবন পিল্লাই

1
সহজ সমাধান ... তবে এই উজ্জ্বল জন্য! আমি একটি সরবরাহকারী ব্যবহার করেছি তখন আমি গন্তব্য ডিরেক্টরিটি পরিবর্তন করার জন্য ব্যবহারকারীর সম্ভাবনা প্রবেশ করলাম ... আর কিছুই কাজ করেনি কারণ সেই মুহুর্তে সরবরাহকারীর গতিশীল হওয়া উচিত .... আপনি আমার দিনটি বাঁচিয়েছিলেন!
ব্রোনজ

1
এই সমাধানটি ব্যবহার করে কোডটি কাজ শুরু করে। এর মধ্যে কোনটি কাজ করছে তা পরীক্ষা করে অপ্রয়োজনীয় কোড সরানো হয়েছে
কার্তিক

1
ভাই আপনি আমার দিন বাঁচিয়েছেন। অনেক অনেক ধন্যবাদ :-)
মঞ্জুনাথ কল্লাননাভ

1
আমার জন্য দুর্দান্ত কাজ করেছে, একজন নতুন শিক্ষার্থী হিসাবে এটি আমাকে বুঝতে পেরেছিল যে আমি বাহ্যিক ফাইলগুলি থেকে পাচ্ছি না তবে ক্যাশে
টনি মেরিট

82

সক্ষম স্বাদ (দেব, পর্যায়) পরে একই সমস্যা পেয়েছেন।

স্বাদের আগে আমার পথের উত্সটি এ রকম দেখায়:

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

অ্যানড্রয়েড যুক্ত হওয়ার পরে: কর্তৃপক্ষ = "$ {অ্যাপ্লিকেশন আইডি}। ফাইলফ্ল্যাভাইডার" ম্যানিফেস্ট অ্যাপ্লিকেশনটিতে pl.myapp.dev বা pl.myapp.stage স্বাদে নির্ভর করে এবং অ্যাপটি ক্রাশ শুরু হয়েছিল started আমি পুরো পথটি সরিয়ে নিয়ে এটিকে বিন্দুর সাথে প্রতিস্থাপন করেছি এবং সবকিছুই কাজ শুরু করে।

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

7
আমার জন্য কাজ করেছেন। ধন্যবাদ! আপনি কীভাবে সামনে এসেছেন? ' স্বরলিপি?
নাইটফিউরি

2
@ অন্যাগ্রাভিটি আপনি কি এই সমাধানটির রেফারেন্স / ডকুমেন্টেশন সরবরাহ করতে পারেন?
জিকোরুল

7
এই সমাধানের কোনও নেতিবাচক পরিণতি আছে কি?
RediOne1

আমার জন্য কাজ করেছেন, অনেক অনেক ধন্যবাদ।
হিরেন

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! একমাত্র সমাধান যা কাজ করেছিল
উদাহরণস্বরূপ

43

আপনি যদি অভ্যন্তরীণ ক্যাশে ব্যবহার করেন তবে ব্যবহার করুন।

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

3
ধন্যবাদ, আমার পরিস্থিতি: আমি একটি অ্যাপ্লিকেশন ইনস্টল করতে চাই যা / ডেটা / ডেটা / পি কেজি_নেম / ফাইলগুলিতে সংরক্ষণ করে, তাই আমার সঠিক কনফিগারেশনটি অনুসরণ করুন: <ফাইল-পথের নাম = "ফাইলগুলি" পথ = "/" />
অলফনে

25

2 সপ্তাহ হারিয়েছে কিছু সমাধান খোঁজার চেষ্টা করে ... উপরোক্ত কিছু চেষ্টা করার পরে যদি আপনি এখানে পৌঁছে যান:

1 - আপনার ট্যাগ প্রদানকারী যদি ট্যাগ প্রয়োগের ভিতরে থাকে তবে যাচাই করুন

<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 - আপনি যদি সাফল্য ছাড়াই অনেকগুলি পথ চেষ্টা করেন তবে এটি দিয়ে পরীক্ষা করুন:

<?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>

এটি পরীক্ষা করুন, যদি ক্যামেরা কাজ করে তবে কিছু লাইন মুছে ফেলুন এবং পরীক্ষা চালিয়ে যান ...

3 - আপনার এমুলেটরটিতে ক্যামেরা সক্রিয় রয়েছে কিনা তা যাচাই করতে ভুলবেন না।


1
ধন্যবাদ, এটি আমার পক্ষে কাজ করেছে। অন্য পথগুলি সরানোর প্রয়োজন কি?
কোডস্লেভ

22

আমি নিশ্চিত আমি পার্টিতে দেরি করেছি তবে নীচে আমার পক্ষে কাজ করেছে।

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

এটি আমার কোডটিও কাজ করার চূড়ান্ত পদক্ষেপ ছিল! ধন্যবাদ।
কুকুর ডগমা

15

এটি আমাকে কিছুটা বিভ্রান্ত করছে।

আপনার এক্সএমএল ফাইলটিতে সমস্যাটি "পথ" বৈশিষ্ট্যে রয়েছে।

এই দস্তাবেজ থেকে ফাইলপ্রভাইডার 'পাথ' একটি উপ-ডিরেক্টরি, তবে অন্য নথিতে (ক্যামেরা / ফোটোবাসিক) দেখানো 'পথ' পুরো পথ path

<?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>

আমি এই 'পাথ'টিকে পুরো পথে পরিবর্তন করেছি এবং এটি কেবল কাজ করে।


15

আমার দেরি হবে তবে আমি এর সমাধান পেয়েছি me

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

1
আমার জন্য provider_paths.xmlএটি একটি পরিদর্শন সতর্কতা দেয় "এলিমেন্টের মূলের পথটি এখানে অনুমোদিত নয়"।
লুইস এ। ফ্লোরিট

15

সচেতন থাকুন যে বাহ্যিক-পথটি আপনার গৌণ স্টোরেজটির দিকে নির্দেশ করছে না, ওরফে "অপসারণযোগ্য সঞ্চয়স্থান" ("বাহ্যিক" নাম সত্ত্বেও)। যদি আপনি "কনফিগার করা রুটটি খুঁজে পেতে ব্যর্থ হন" তবে আপনি এই এক্সটিএমএল ফাইলটিতে এই লাইনটি যুক্ত করতে পারেন।

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

ফাইলপ্রভাইডার এবং গৌণ বাহ্যিক স্টোরেজ এখানে আরও বিশদ দেখুন


14

আপনার ডিভাইসটি কয়টি স্টোরেজ অফার করে তা পরীক্ষা করে দেখুন - গৌণ স্টোরেজ থেকে ফাইল ভাগ করে নেওয়া সমর্থন করে না। তাকান FileProvider.javaউৎস (থেকে সমর্থন কোর-utils 25.3.1 ):

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

সুতরাং, তারা কেবল প্রথম সঞ্চয়স্থান নেয়।

এছাড়াও, আপনি দেখতে পাচ্ছেন যে ইন্টারফেসের getExternalCacheDirs()মাধ্যমে স্টোরেজের তালিকা অর্জন করতে ব্যবহৃত হয় ContextCompat। এর সীমাগুলির জন্য ডকুমেন্টেশন দেখুন (এটি উদাহরণস্বরূপ ইউএসবি ফ্ল্যাশগুলি সনাক্ত না করার জন্য বলা হয়েছে)। আপনার নিজের থেকে এই এপিআই থেকে স্টোরের তালিকার কয়েকটি ডিবাগ আউটপুট তৈরি করা সেরা, যাতে আপনি স্টোরেজটিতে যে পাথটি পেরিয়েছেন তার সাথে মেলে কিনা তা পরীক্ষা করতে পারেন BestgetUriForFile()

গুগলের ইস্যু ট্র্যাকারে ইতিমধ্যে একটি টিকিট বরাদ্দ রয়েছে (একাধিক স্টোরেজ সমর্থন করার জন্য জিজ্ঞাসা করে)'s অবশেষে, আমি এটির উপরও এসও প্রশ্ন পেয়েছি ।


1
এই গভীরতর উত্তরটি আরও বেশি উপায়ে পাওয়া উচিত। বাহ্যিক স্টোরেজ ফাইলপ্রভাইডার আসলে কী স্বীকৃত তা অনুসন্ধান করার জন্য আপনাকে ধন্যবাদ।
LarsH

10

আমি এর জন্য 5 ঘন্টা ব্যয় করেছি ..

আমি উপরের সমস্ত পদ্ধতি চেষ্টা করেছি তবে এটি বর্তমানে আপনার অ্যাপটি কী স্টোরেজ ব্যবহার করছে তা নির্ভর করে।

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

কোডগুলি চেষ্টা করার আগে ডকুমেন্টেশন চেক করুন।

আমার ক্ষেত্রে যেহেতু files-pathসাব ডিরেক্টরি হবে Context.getFilesDir()। মজাদার বিষয় এটি Context.getFilesDir()একে অপরের উপ-ডিরেক্টরি নোট করে।

আমি যা খুঁজছি তা হ'ল

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

Context.getFilesDir()

আয় /data/user/0/com.psh.mTest/files

তাই ট্যাগ হওয়া উচিত

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

তাহলে কাজ করে !!


1
ডকুমেন্টেশন উল্লেখ করার জন্য ধন্যবাদ। এটি আমাকে সঠিক উত্তরের দিকে নিয়ে গেছে। আমার ক্ষেত্রে আমার ফাইলটি সংরক্ষণ করা হয়েছিল getExternalStorageDirectory()এবং আমার <external-path>পরিবর্তে ট্যাগের সাথে পথ সরবরাহ করার কথা ছিল<files-path>
alierdogan7

ফাইল-পাথের এই নির্দিষ্ট উত্তরের জন্য আপনাকে ধন্যবাদ। এটি অনেক সাহায্য করেছে। :)
অরুনগিরি_0

হ্যাঁ এটা কাজ করে!!! মূল বিষয়টি হ'ল পথের শুরুতে ".." উল্লেখ করা, যেমন এই পথের মতো = "../ মাইডাইরেক্টরি /"
রবার্ট অপিকান

9

এর কোনওটিই আমার পক্ষে কাজ করেনি। একমাত্র পন্থা যা কাজ করে তা হ'ল এক্সএমএলে সুস্পষ্ট পথ ঘোষণা করা নয়। সুতরাং এটি করুন এবং খুশি হন:

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

এখানেও এই প্রশ্ন সম্পর্কে একটি দুর্দান্ত টিউটোরিয়াল রয়েছে: https://www.youtube.com/watch?v=9ZxRTKvtfnY&t=613s


7

আমার সমস্যাটি হ'ল আমার কাছে ফাইলপথগুলিতে বিভিন্ন ধরণের নাম ওভারল্যাপিং ছিল, এরকম:

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

আমি নামগুলি ("ক্যাশেড ফাইলস") অনন্য হয়ে যাওয়ার পরে, আমি ত্রুটি থেকে মুক্তি পেয়েছি। আমার অনুমান যে এই পাথগুলি কিছু হ্যাশম্যাপ বা এমন কোনও কিছুতে সঞ্চিত রয়েছে যা সদৃশকে অনুমতি দেয় না।


3

এটি সমাধান করার জন্য আমি কী করেছি -

Andro আইডি

<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 (অ্যাপ্লিকেশনটির বহিরাগত ফাইল ডিরেক্টরিতে থাকা সমস্ত ফাইল ভাগ করার জন্য ফাইলপ্রভাইডারকে মঞ্জুরি দেওয়া হচ্ছে)

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

এবং জাভা ক্লাসে -

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

3

এটি আমার জন্যও কাজ করেছে full পূর্ণ পথ দেওয়ার ক্ষেত্রে আমি পথ = "ছবি" দিয়েছি এবং এটি দুর্দান্ত কাজ করেছে।

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

2

এটি নির্ভর করে আপনি কী ধরণের স্টোরেজ করতে চান, অভ্যন্তরীণ বা বহিরাগত

এক্সটার্নাল স্টোরেজের জন্য

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

তবে অভ্যন্তরীণ স্টোরের জন্য, পথটি সম্পর্কে সাবধানতা অবলম্বন করুন, কারণ এটি getFilesDir () পদ্ধতি ব্যবহার করে যার অর্থ আপনার ফাইলটি অ্যাপ্লিকেশনটির জন্য মূল ডিরেক্টরিতে ("/") অবস্থিত হবে that

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

সুতরাং আপনার সরবরাহকারী ফাইলটি অবশ্যই এর মতো হওয়া উচিত:

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

সমস্ত উদাহরণ ধরে নেওয়া যায় যে ব্যবহারকারী বাহ্যিক সঞ্চয়স্থান ব্যবহার করছেন। আমার অভ্যন্তরীণ সঞ্চয়স্থানে সহায়তার দরকার ছিল এবং এই উত্তরটি খুঁজতে বেশ কয়েক ঘন্টা সময় লেগেছিল। ধন্যবাদ.
জিশান

2

উপরের কোনওটিই আমার পক্ষে কাজ করেনি, কয়েক ঘন্টা ডিবাগিংয়ের পরে আমি জানতে পারি যে সমস্যাটি রয়েছে createImageFile(), বিশেষত absolute pathবনামrelative path

আমি ধরে নিয়েছি যে আপনি ছেলেরা ছবি তোলার জন্য অফিসিয়াল অ্যান্ড্রয়েড গাইড ব্যবহার করছেন। 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;
    }

নোট করুন storageDir, এটি সেই অবস্থান যেখানে ফাইলটি তৈরি করা হবে। সুতরাং এই ফাইলটির পরম পাথ পেতে, আমি সহজভাবে ব্যবহার করি image.getAbsolutePath(), onActivityResultফটো তোলার পরে যদি আপনার বিটম্যাপ চিত্রের প্রয়োজন হয় তবে এই পথটি ব্যবহার করা হবে

নীচেটি হল file_path.xml, সহজভাবে ব্যবহার করুন .যাতে এটি পরম পথ ব্যবহার করে

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

এবং আপনার যদি ছবি তোলার পরে বিটম্যাপের প্রয়োজন হয়

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

আমি এই ত্রুটি পেয়েছিলাম Failed to find configured root that contains...

নীচের চারপাশের কাজগুলি আমার সমস্যার সমাধান করে

মাঝামাঝি / XML / file_paths.xml

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

Andro আইডি

<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

অ্যান্ড্রয়েড সরকারী দস্তাবেজ বলছে file_paths.xML থাকা উচিত:

<?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>

তবে এটি সর্বশেষতম অ্যান্ড্রয়েডে কাজ করার জন্য পথের শেষে একটি "/" হওয়া উচিত:

<?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

এক্সএমএল ফাইল_পথ ফাইলটিতে নিম্নলিখিত পরিবর্তনগুলি আমার পক্ষে কাজ করেছিল।

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

1

আমার একই সমস্যা ছিল, আমি এর কাজ করার জন্য নীচের কোডটি চেষ্টা করেছি।

1.সেমফাইল তৈরি করুন: সরবরাহকারী_পথগুলি

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

২.মেনস্টেস্ট ফাইল

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

আপনার জাভা ফাইলে।

      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

যদি কিছু সাহায্য না করে এবং আপনি ত্রুটি পেয়ে যাচ্ছেন

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

তারপরে কিছু লাইন পরিবর্তন করার চেষ্টা করুন:

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

প্রতি:

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

এবং এক্সএমএল ফাইলে:

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

যেটি অদ্ভুত, যেহেতু আমি যে ফোল্ডারটি অ্যাক্সেস করি সেগুলি /images


.GetDir থেকে .getFilesDir এ স্যুইচ করা আমাকে সহায়তা করেছে। ধন্যবাদ!
দিমিত্রি পাভলখিন

1

আমার সমস্যাটি ভুল ফাইল নাম ছিল : file_paths.xmlরিসোর্স / এক্সএমএল এর অধীনে তৈরি করি যখন উত্সটি provider_paths.xmlম্যানিফেস্টে সেট করা থাকে:

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

আমি পরিবর্তন provider_pathsকরতে file_pathsএবং সমস্যা সমাধান।


1

যদি আপনার ফাইলের পথটি / স্টোরেজ / এমুলেটেড / 0 / "আপনার ফাইল" এর মতো হয়

আপনার কেবলমাত্র আপনার ফাইলপ্রভাইডার এক্সএমএল পরিবর্তন করতে হবে

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

তারপরে আপনার ফাইল ভাগ করার দরকার হলে এই ফাংশনটি কল করুন

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

এটি অ্যান্ড্রয়েড এম ~ পাইয়ে কাজ করে


এটি কাজ করছে! তবে কেন আপনি পথ = "ব্যবহার করি তা আপনি ব্যাখ্যা করতে পারেন use" পথের পরিবর্তে = "ডিসিআইএম", "ছবি" ...?
হোয়াং লাম

@ হোয়াং লাম পার্থক্যটি হল আপনার কোনও ডিরেক্টরি নির্দিষ্ট করা দরকার কিনা, আমার উদাহরণে আপনি সমস্ত অ্যাক্সেস করতে পারবেন
অলস

0

আমি দেখতে পাচ্ছি যে অন্তত আপনি file_paths.xML এ অন্যদের মতো একই পথ সরবরাহ করছেন না। সুতরাং দয়া করে নিশ্চিত করুন যে আপনি ঠিক একই প্যাকেজের নাম বা পাথ 3 টি স্থানে সরবরাহ করেছেন:

  • android:authorities ম্যানিফেস্টে বৈশিষ্ট্য
  • path file_paths.xML এ অ্যাট্রিবিউট
  • authority ফাইলপ্রভাইডার.জেটউরিফোর্ড ফাইল () কল করার সময় যুক্তি

0
  • জন্য Xamarin.Android ব্যবহারকারীদের

অ্যান্ড্রয়েড 7.1, 8.0+ টার্গেট করার সময় এটি আপনার সমর্থন প্যাকেজগুলি আপডেট না করার ফলাফলও হতে পারে। তাদের v25.4.0.2 + এ আপডেট করুন এবং এই বিশেষ ত্রুটিটি চলে যেতে পারে (অন্যদের বর্ণিত হিসাবে আপনার ফাইল_পথ ফাইলটি সঠিকভাবে কনফিগার করেছেন)।


প্রসঙ্গ প্রদান: আমি লক্ষ্য করে স্যুইচ Oreo থেকে বাদামের তক্তি একটি Xamarin.Forms অ্যাপ্লিকেশন এবং সঙ্গে একটি ছবি তুলে Xam.Plugin.Media উপরে ত্রুটি বার্তা সহ ব্যর্থ শুরু, তাই প্যাকেজ আপডেট করার আমার জন্য কৌতুক করেনি ঠিক।


0

আমি লক্ষ্য করেছি যে path.xmlফাইল সংক্রান্ত নীতি বা আচরণটি সাপোর্ট লাইব্রেরি 26 এবং 27 এর মধ্যে পরিবর্তিত হয়েছে the ক্যামেরা থেকে একটি ছবি ক্যাপচার করার জন্য, আমি নিম্নলিখিত পরিবর্তনগুলি দেখেছি:

  • 26 সহ, আমাকে ব্যবহার করতে <external-path>হয়েছিল এবং pathযুক্তিতে প্রদত্ত পূর্ণ পথ ।

  • 27 সহ, আমাকে যুক্তিটিতে <external-files-path>কেবলমাত্র সাবফোল্ডার ব্যবহার করতে হয়েছিল path

তাই path.xmlফাইলটি যেভাবে সমর্থন লাইব্রেরি 27 সহ বিশেষত আমার জন্য কাজ করেছিল

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

0

হ্যালো বন্ধুরা চেষ্টা করুন

এই কোডে

1) ম্যানিফেস্টে 2 ফাইল সরবরাহকারী কীভাবে ঘোষণা করবেন।

2) ফাইল ডাউনলোডের জন্য প্রথম সরবরাহকারী

3) দ্বিতীয় সরবরাহকারী ক্যামেরা এবং গ্যালারী জন্য ব্যবহৃত

ধাপ 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>

দ্বিতীয় সরবরাহকারী

     <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

ক্লাস মাইফাইলপ্রোভাইডার তৈরি করুন (কেবল কোনও ক্লাস তৈরি করুন কোনও পদ্ধতি ঘোষণা করা হয়নি)

যখন আপনি ফাইল সরবরাহকারী এই নামটি (.fileprovider) ব্যবহার করেন এবং আপনি চিত্রের (.provider) জন্য এটি ব্যবহার করেন।

যদি এই কোডটি বুঝতে কোনও সমস্যা হয় আপনি rp1741995@gmail.com এ যোগাযোগ করতে পারেন আমি আপনাকে সহায়তা করব।


0

সমস্যাটি কেবল পথের এক্সএমএল নাও হতে পারে।

নিম্নলিখিত আমার সংশোধন করা হয়:

এখানে রুট কোর্সটি অনুসন্ধান করা 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);
        }

        // ...
    }

এর অর্থ mRootsঅনুরোধ করা uri এর ট্যাগ থাকা উচিত। সুতরাং আমি মুদ্রণ mRootsএবং ইউরি ট্যাগের জন্য কিছু কোড লিখি , এবং সহজেই ট্যাগগুলির সাথে মেলে না

এটি প্রকাশক কর্তৃপক্ষ হিসাবে নির্ধারণ ${applicationID}.providerকরা একটি নির্বোধ ধারণা ! এই কর্তৃপক্ষটি এত সাধারণ যে অন্যান্য সরবরাহকারীরাও এটি ব্যবহার করতে পারেন যা পাথ কনফিগারেশনে বিশৃঙ্খলা সৃষ্টি করবে!


-1

আপনাকে এ থেকে xML ফাইল file_paths.xML পরিবর্তন করতে হবে

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

প্রতি

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

1
যদিও আপনি উপরে থেকে আপনার উত্তরটি অনুলিপি করেছেন, তবে এটি সঠিকভাবে করা হয় না। আপনার উত্তরে টাইপিংয়ের অমিলটি সংশোধন করুন।
অভিনব সাক্সেনা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.