آموزش FileProvider در برنامه نویسی اندروید

سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش FileProvider در برنامه نویسی اندروید می پردازیم در ادامه به بررسی خطا های احتمالی می پردازیم به بررسی خود FileProvider می پردازیم با ما همراه باشید.
از api 24 (اندروید N ) به بعد امکان ارسال Intent که شامل مسیری از فایل (file://) باشد امکان پذیر نیست در صورتی که از کد ارسال ساده Intent استفاده کنید با خطای FileUriExposedException مواجه می شوید.
 
برای این کار ابتدا وارد پوشه res شوید و یک پوشه به نام xml ایجاد کنید و در آن یک فایل به نام filepaths.xml ایجاد کنید و کد زیر را در آن قرار دهید.

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

در بالا path مسیری است که می خواهید قرار دهید (یعنی مسیر فایل شما نه به شکل کلی به شکل پوشه ای) در صورتی که همانند بالا قرار گیرد منظور root می شود.
سپس وارد فایل AndroidManifest.xml شده و کد زیر را در آن قرار دهید.

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

سپس در بخش اکتیویتی کد زیر را قرار دهید.

File imagePath = new File(getFilesDir(), "external_files");
    imagePath.mkdir();
 File imagePath = new File(getFilesDir(), "documents");
 imagePath.mkdir();
 File newFile= new File(imagePath.getPath(), "test.jpg");
 Uri contentUri = getUriForFile(MainActivity.this,
 getApplicationContext().getPackageName(), newFile);
 Intent shareIntent = new Intent();
 shareIntent.setAction(Intent.ACTION_SEND);
 shareIntent.setType("image/*");
 shareIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
 shareIntent.addFlags(FLAG_GRANT_READ_URI_PERMISSION);
 shareIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 List<ResolveInfo> resInfoList = getApplicationContext().getPackageManager().queryIntentActivities(shareIntent, PackageManager.MATCH_DEFAULT_ONLY);
 for (ResolveInfo resolveInfo : resInfoList) {
 String packageName = resolveInfo.activityInfo.packageName;
 getApplicationContext().grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | FLAG_GRANT_READ_URI_PERMISSION);
 }
 startActivity(intent);

بخش مهم بالا

 List<ResolveInfo> resInfoList = getApplicationContext().getPackageManager().queryIntentActivities(shareIntent, PackageManager.MATCH_DEFAULT_ONLY);
 for (ResolveInfo resolveInfo : resInfoList) {
 String packageName = resolveInfo.activityInfo.packageName;
 getApplicationContext().grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | FLAG_GRANT_READ_URI_PERMISSION);
 }

کد بالا دسترسی ارسال به همه نوع اپلیکیشن را برای اپ شما فراهم می کند .یکسری نکته هست باید دقت کنید این کد فقط در اندروید 7 کار می کند پس باید بررسی کنید که گوشی کاربر چه api است .
برای اینکه نسخه api را بررسی کنید از کد زیر استفاده کنید.

if (Build.VERSION.SDK_INT==24)

 
این آموزش هم به پایان رسید.
 
موفق و موید باشید.

مطالعه بیشتر