آموزش FileProvider در برنامه نویسی اندروید
سلام دوستان در این سری از آموزش برنامه نویسی اندروید به آموزش FileProvider در برنامه نویسی اندروید می پردازیم در ادامه به بررسی خطا های احتمالی می پردازیم به بررسی خود FileProvider می پردازیم با ما همراه باشید.
از api 24 (اندروید N ) به بعد امکان ارسال Intent که شامل مسیری از فایل (file://) باشد امکان پذیر نیست در صورتی که از کد ارسال ساده Intent استفاده کنید با خطای FileUriExposedException مواجه می شوید.
برای این کار ابتدا وارد پوشه res شوید و یک پوشه به نام xml ایجاد کنید و در آن یک فایل به نام filepaths.xml ایجاد کنید و کد زیر را در آن قرار دهید.
1 2 3 4 5 6 | <paths xmlns:android="http://schemas.android.com/apk/res/android"> <files-path name="names" path="./" /> </paths> |
در بالا path مسیری است که می خواهید قرار دهید (یعنی مسیر فایل شما نه به شکل کلی به شکل پوشه ای) در صورتی که همانند بالا قرار گیرد منظور root می شود.
سپس وارد فایل AndroidManifest.xml شده و کد زیر را در آن قرار دهید.
1 2 3 4 5 6 7 8 9 | <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> |
سپس در بخش اکتیویتی کد زیر را قرار دهید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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); |
بخش مهم بالا
1 2 3 4 5 | 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 را بررسی کنید از کد زیر استفاده کنید.
1 | if (Build.VERSION.SDK_INT==24) |
این آموزش هم به پایان رسید.
موفق و موید باشید.
ممنون از آموزش خوبی که گذاشتید.
یکی از مواردی هست که کاربرها کم کم بهش برخورد میکنند و جزو آموزشهای پربازدید خواهد بود.
البته بنده این کد را با توجه به نیازی که داشتم ساده تر نوشتم:
خیلی خوبه ممنون از اینکه این کد را با دوستان به اشتراک گذاشتید .
سلام
توی هیچ سایت ایرانی و خارجی راجع به اتصال به api تلگرام مطلبی وجود نداره .
این آموزش میتونه خیلی برای برنامه نویس ها مفید باشه.
ممنون میشم اگر این آموزش رو هم قرار بدید.
منظورتون از api استفاده از تلگرام در اندروید است (ارتباط با سرور تلگرام و …) یا می خواید سورس تلگرام رو کامپایل کنید ؟
سلام
مطلب بسیار عالی هست
منم تو هیچ سایتی نتونستم چنین موضوعی رو پیدا کنم.
الانم مشکلم اینه که میخوام apk رو از رو لینک سرورم نصب کنم درapi 14 و نمیخوام داخل assest بذارمش.
راه حلی می دونید.
پیشاپیش سپاسگزار بزرگواری شما هستم
به زودی آموزش قرار می گیرد.
سلام
من این قسمت رو متوجه نمیشم
path=”./”
من اگه بخوام بگم که فایل من در sdcard در پوشه my_app قرار داره مثل مسیر زیر =>
sdcard/my_app/App.apk
path رو چه طوری باید وار کنم اینجا؟
مشکل من این هستش که کد Startactivity برای ورو به یه intent جدید اجرا میشه ولی یهو بر میگرده به اکتیویتی که توش هستم و نمیدونم دلیلش چیه