استفاده از روش های قدیمی کار با Intent بجای FileProvider در اندروید +۸
💡 با توجه به موارد امنیتی ای که گوگل هر لحظه برای اندروید لحاظ میکنه ماهم باید موقع استفاده از موارد و کدهای قدیمی حواسمون به این مورد باشه که آیا این کدها در اندرویدهای بالاتر همچنان کار میکنند یانه؟ یکی از اون موارد بحث FileProvider هست که در ادامه بیشتر باهاش آشنا میشیم.
🔸 تقریباً همهی ما با کد های اشتراک گذاری فایل، عکس، و… ، کد درخواست نصب یک برنامه، اینتنت تغییر پس زمینه گوشی و کدهای این چنینی آشنایی داریم و کم و بیش استفاده میکنیم.
❗️ اما آیا میدونستید اگر فیلد TargetSDK در منیفست رو روی ۲۶ به بالا بذارید موقع استفاده از اینطور کد ها در اندروید ۸ به بالا با خطا مواجه میشید؟
‼️ نمونه ای از این خطا:
android.os.FileUriExposedException: file:///… exposed beyond app through ClipData.Item.getUri()
at android.os.StrictMode.
onFileUriExposed(StrictMode.java:1958)
❎ چرا با این خطا مواجه میشیم و راه حلش چیه؟!
استفاده از کدهایی که در بالا مثال زدیم و کدهای اینتنت های مشابه ی اون، در اندروید ۸ به بالا کمی تغییر داشته و گوگل اعلام کرده بدلایل رعایت بحث های امنیتی در اندروید باید ازاین نسخه به بعد تغییراتی در کد های خودتون بدید که کاملاً در این لینک شرح استفاده ی اون در جاوا و در این لینک نحوه استفادش برای بیسیک۴اندروید توضیح داده شده. (بزودی آموزش فارسی این لینک ها توسط کافه توسعه آماده میشه)
✅ آیا غیر از این، راه ساده تری وجود داره؟
بله، شما براحتی میتونید به اندروید اعلام کنید که مواردی که انجام دادید و توصیه کردید رو من برای اپلیکیشن هام نمیخوام رعایت کنم و قصد دارم همچنان از کدهای قدیمی استفاده کنم و به خطاهای بالا هم برنخورم!
❇️ برای اینکار کافیه کد زیر رو در سرویس Starter یا یکی از اکتیویتی هاتون که اولین بار اجرا میشه قرار بدید(هدف اینه که فقط این کد یکبار اجرا بشه و مهم نیست کجا قرار میدین)
#if java import android.os.StrictMode; public void _onCreate() { //@cafetoseeh if (android.os.Build.VERSION.SDK_INT >= 18) { StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder(); StrictMode.setVmPolicy(builder.build()); //cafetoseeh.ir builder.detectFileUriExposure(); }} #End If
برای استفاده ازاین کد در جاوا هم کافیه خط ۴ الی ۹ رو در خط اول متد Oncreate اکتیویتی MainActivity تون قرار بدید.
✏️ منبع: کافه توسعه