رفتن به مطلب
  • 1

دسترسی حافظه در اندروید11


امیرحسین قاسمی

سوال

سلام،

دوستان من با متد WriteString یک فایل TXT در حافظه داخلی ایجاد می کنم و بعد یک سری عملیات روی اون انجام میدم.

دسترسی حافظه رو هم با Runtime می گیرم و در اندروید 7 همه چی درست کار می کنه اما تو اندروید 11 برنامه فورس کلوز میده:

main_ok_click (java line: 515)
java.io.FileNotFoundException: /storage/emulated/0/CreateProject.txt: open failed: EPERM (Operation not permitted)
	at libcore.io.IoBridge.open(IoBridge.java:492)
	at java.io.FileOutputStream.<init>(FileOutputStream.java:236)
	at anywheresoftware.b4a.objects.streams.File.OpenOutput(File.java:449)
	at anywheresoftware.b4a.objects.streams.File.WriteString(File.java:264)
	at com.AndroAppino.main._ok_click(main.java:515)
	at java.lang.reflect.Method.invoke(Native Method)
	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:213)
	at anywheresoftware.b4a.BA.raiseEvent2(BA.java:197)
	at anywheresoftware.b4a.BA.raiseEvent(BA.java:193)
	at anywheresoftware.b4a.objects.ViewWrapper$1.onClick(ViewWrapper.java:80)
	at android.view.View.performClick(View.java:8160)
	at android.widget.TextView.performClick(TextView.java:16222)
	at android.view.View.performClickInternal(View.java:8137)
	at android.view.View.access$3700(View.java:888)
	at android.view.View$PerformClick.run(View.java:30236)
	at android.os.Handler.handleCallback(Handler.java:938)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:246)
	at android.app.ActivityThread.main(ActivityThread.java:8512)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)
Caused by: android.system.ErrnoException: open failed: EPERM (Operation not permitted)
	at libcore.io.Linux.open(Native Method)
	at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
	at libcore.io.BlockGuardOs.open(BlockGuardOs.java:254)
	at libcore.io.ForwardingOs.open(ForwardingOs.java:166)
	at android.app.ActivityThread$AndroidOs.open(ActivityThread.java:8373)
	at libcore.io.IoBridge.open(IoBridge.java:478)
	... 21 more

این هم لاگ فورس کلوز در اندروید 11 هست.

target رو روی 26،29 و 30 هم گذاشتم فرقی نکرد. کد زیر رو هم به منیفست اضافه کردم بازهم در اندروید 11 فورس کلوز میده:

SetApplicationAttribute(android:requestLegacyExternalStorage,"true")

مشکل دقیقا از چیه؟

لطفا راهنمایی کنید، ممنونم:53:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

7 پاسخ به این سوال تاکنون داده شده است

ارسال‌های توصیه شده

در ۱۴۰۰/۴/۲۳ در ۱۱:۴۵، امیرحسین قاسمی گفته است:

سلام،

دوستان من با متد WriteString یک فایل TXT در حافظه داخلی ایجاد می کنم و بعد یک سری عملیات روی اون انجام میدم.

دسترسی حافظه رو هم با Runtime می گیرم و در اندروید 7 همه چی درست کار می کنه اما تو اندروید 11 برنامه فورس کلوز میده:

این هم لاگ فورس کلوز در اندروید 11 هست.

target رو روی 26،29 و 30 هم گذاشتم فرقی نکرد. کد زیر رو هم به منیفست اضافه کردم بازهم در اندروید 11 فورس کلوز میده:

SetApplicationAttribute(android:requestLegacyExternalStorage,"true")

مشکل دقیقا از چیه؟

لطفا راهنمایی کنید، ممنونم:53:

تو اندروید ۱۱ داستان فرق کرده برا دسترسی به حافظه. باید از دسترسی MANAGE_EXTERNAL_STORAGE استفاده کنید. این دسترسی رو به منیفست اضافه کنید و به صورت رانتایم بگیرید اونو. بعد از اون باید با کد زیر دسترسی فایل رو بگیرید. کد رو تبدیل به بیسیک کنید البته

Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);

 

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۴/۲۳ در ۱۲:۱۴، محمدرضا شاهپیری گفته است:

تو اندروید ۱۱ داستان فرق کرده برا دسترسی به حافظه. باید از دسترسی MANAGE_EXTERNAL_STORAGE استفاده کنید. این دسترسی رو به منیفست اضافه کنید و به صورت رانتایم بگیرید اونو. بعد از اون باید با کد زیر دسترسی فایل رو بگیرید. کد رو تبدیل به بیسیک کنید البته

Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);

 

ببخشید  میشه یک سورس پیوست کنید؟ البته اگه زحمتی نباشه🌹

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بفرما این هم سورس

رمز فایل : answercenter.ir

permission android11.zip

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۴/۲۴ در ۲۳:۱۳، shahab.msb گفته است:

بفرما این هم سورس

رمز فایل : answercenter.ir

permission android11.zip 26.19 kB · 0 دریافت

عزیز برای اندروید 11 میخواستن دوستمون نه 10 یا کمتر. این کدی که شما گذاشتین صرفا دسترسی رانتایمه

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۴/۲۴ در ۱۳:۴۷، محمدرضا شاهپیری گفته است:

عزیز برای اندروید 11 میخواستن دوستمون نه 10 یا کمتر. این کدی که شما گذاشتین صرفا دسترسی رانتایمه

خب من این رو روی اندروید 11 تست کردم مشکلی نداره عزیز

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۴/۲۵ در ۱۰:۲۰، shahab.msb گفته است:

خب من این رو روی اندروید 11 تست کردم مشکلی نداره عزیز

چون تارگت رو روی ۲۹ گذاشتین. تارکت باید روی ۳۰ باشه

لینک ارسال
به اشتراک گذاری در سایت های دیگر

در ۱۴۰۰/۴/۲۳ در 12:14، محمدرضا شاهپیری گفته است:

تو اندروید ۱۱ داستان فرق کرده برا دسترسی به حافظه. باید از دسترسی MANAGE_EXTERNAL_STORAGE استفاده کنید. این دسترسی رو به منیفست اضافه کنید و به صورت رانتایم بگیرید اونو. بعد از اون باید با کد زیر دسترسی فایل رو بگیرید. کد رو تبدیل به بیسیک کنید البته

Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", this.getPackageName(), null);
intent.setData(uri);
startActivity(intent);

 

سلام مجدد،

#If Java
import android.content.Intent;
import android.net.Uri;
import android.provider.Settings;

public void getPer() {
Intent intent = new Intent();
intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
Uri uri = Uri.fromParts("package", this.getPackageName() , null);
intent.setData(uri);
startActivity(intent);
}
#End If

Sub Button1_Click
	Dim jo As JavaObject
	jo.InitializeContext
	jo.RunMethod("getPer", Null)
End Sub

من از این قابلیت استفاده کردم و صفحه زیر باز شد:

 

Screenshot_%DB%B2%DB%B0%DB%B2%DB%B1%DB%B0%DB%B7%DB%B3%DB%B1_%DB%B1%DB%B8%DB%B2%DB%B0%DB%B5%DB%B9_Settings.jpg

همونجوری که می بینید اون toggle button غیرفعال هست.

دسترسی رو هم بدین شکل اضافه کردم به مانیفست:

AddPermission(MANAGE_EXTERNAL_STORAGE) 

این دسترسی رو به صورت ران تایم هم گرفتم.

 

یک نکته دیگه ای هم هست: من توی اون کد جاوا به جای this.getPackageName() پکیج نیم واتساپ و تلگرام هم قرار دادم ولی برای هیچ کدوم شون این گزینه فعال نبود و مثل تصویر بالا بازم اون دکمه اجازه دسترسی به فایل ها غیرفعال بود. در حالی که این دو برنامه به راحتی به حافظه دسترسی دارن و ازین روش استفاده نکردن و فقط دسترسی رانتایم میگیرن.

من میام دقیقا همون دسترسی به حافظه رو از طریق رانتایم میگیرم مشکلی نیست اما وقتی یک فایلی میخواد توی حافظه داخلی گوشی (dirrootexternal) نوشته بشه برنامه فورس کلوز میده(در اندروید یازده)

در واقع دسترسی به حافظه اعطا میشه اما هنگام کار با حافظه توی اندروید 11 فورس کلوز داده میشه.

شما خودتون تو پروژه هاتون چطوری دسترسی به حافظه رو میگیرن؟ توی اندروید 11 و 12 کار می کنن؟

لطفا راهنمایی کنید. ممنون:53::53::53:

لینک ارسال
به اشتراک گذاری در سایت های دیگر

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...