رفتن به مطلب
برای استفاده از انجمن و عضـویت کلیک کنید.

AnswerCenter

مرکز پاسخگویی به سوالات برنامه نویسی

  • مرجع پاسخگویی
  • تولید آموزش
  • سفارش پروژه

درخواست سفارش پروژه

اطلاعیه

کاربر گرامی

به انجمن برنامه نویسی AnswerCenter.ir خوش آمدید

 برای استفاده از تمامی امکانات سایت لطفا در انجمن عضو شوید


  • 0
sbr

دسترسی نوشتن روی کارت حافظه (sd card جانبی ) در اندروید +6

سوال

sbr    227

کاربر رو به رشد

سلام دوستان خسته نباشید  

برای نوشتن روی sd card توی اندروید +6 چکار باید کرد ؟؟ 

با وجود ران تایم پرمیژن دسترسی های زیر  

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

فقط اجازه نوشتن و روی حافظه داخلی رو میده و  اجازه نوشتن روی کارت حافظه داده نمیشه 

با این وجود چطور خیلی از برنامه ها توی اندروید های بالا هم دسترسی به نوشتن روی کارت حافظه رو دارن ؟؟؟ 

بازم تاکید میکنم نوشتن روی کارت حافظه ی جانبی ( Sd Card) منظورم هست 

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


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

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

پست های پیشنهاد شده

  • 0
sbr    227

کاربر رو به رشد

سلامی مجدد 

خب راه حلش رو پیدا کردم 

از اندرود 6 به بالا ران تایم پرمیژن های زیر 



<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

تنها برای حافظه داخلی گوشی هستند ولی برای دسترسی نوشتن و یا حذف فایل ها از روی کارت حافظه علاوه بر دسترسی های بالا باید از Storage Access Framwork استفاده کرد 

ZNDgX.png

 

با این کد متونید framwork رو اجرا کنید  

startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), 42);

و وقتی مسیر اصلی کارت حافظه رو ذخیره کردید ، به صورت خودکار متد نتیجه اجرا میشه ↓↓↓↓↓↓↓↓

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {


        if (resultCode != RESULT_OK)
            return;
        else {
            Uri treeUri = resultData.getData();
            DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
            grantUriPermission(getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

// ذخیر کردن مقدار یوری در شیرد پرفرنس
            preferences = getSharedPreferences("MyShared" , MODE_PRIVATE) ;
            SharedPreferences.Editor editor = preferences.edit() ;
            editor.putString("Dir" , treeUri.toString());
            editor.commit() ;

        }
    }

همونطور که توی کد مشخص هست ابتدا چک میکنه که مسیری رو انتخاب کردید یا نه 

بعد از طریق Uri مقدار اینتنت رو دریافت میکنه و توی Sharedprefrences ذخیره میکنیم تا هر موقع لازم داشتیم دوباره بگیریمش

اما نکته خیل مهم اینه که به توصه گوگل باید از DocumentFile به جای File استفاده کنید البته داکیومنت فایل هم کار باهاش سخت نیست و اکثر متد های File رو داره 

هر جا هم خواستیم استفاده کنیم مقدار ذخیره شده توی SharedPrefrences رو که به صورت رشته ذخیره کرده بودیم مگیریم و دوباره به Uri تبدیل میکنیم و در نهایت به  DocumentFile میدیم 

      Uri uri = Uri.parse(preferences.getString("Dir" ,""));

        DocumentFile file = DocumentFile.fromTreeUri(MainActivity.this , uri ) ;
		file.ListFiles[]

خب مسیر انتخاب شده و ذخیره شده توسط Uri رو به DocumentFile دادیم و الان مسیر اصلی کتابخونه رو داریم و با داکیومنت فایل  مث همون File عمل مکنیم

 

و الان دسترسی کامل به کارت حافظه  رو داریم 

امیدوارم به کارتون بیاد 

البته من خودم خواستم از متدDelete استفاده کنیم اما حواسم نبود و یه خط رو جا انداختم و نتیجه این شد که اشتباها  مسیر اصیلی کارت حافظم رو دادم به متد Delete و الان کارت حافظم خیلی شیک و مجلسی فرمت شد ☺

دقت کنید به مسیر هاتون 

 

 

با اجازه دوستان و اساتید ، به عنوان بهترین پاسخ انتخاب میکنم 

  • پسندیدن 2

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
مجید آرتا    5,753

مدیر کل سایت

سلام

به صورت رانتایم دسترسی رو از کاربر میگیرید ؟

دسترسی نوشتن روی sd card  رو به صورت رانتایم بگیرید.

از لینک های زیر هم میتونید استفاده کنید »

Sample 1

Sample 2

Sample 3

  • پسندیدن 1

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
sbr    227

کاربر رو به رشد

در 4 ساعت قبل، مجید آرتا گفته است :

سلام

به صورت رانتایم دسترسی رو از کاربر میگیرید ؟

دسترسی نوشتن روی sd card  رو به صورت رانتایم بگیرید.

از لینک های زیر هم میتونید استفاده کنید »

Sample 1

Sample 2

Sample 3

بله دسترسی ران تایمرو میگیرم از کاربر 

اما همچنان اجازه نوشتن و  یا حذف فایل از روی sd card  رو نمیده 

با وجود  گرفتن دسترسی های گفته شده همچنان امکان نوشتن و یا حذف فایل از  روی کارت حافظه جانبی رو نمیده 

فقط دسترسی ها رو برای حافظه داخلی گوشی میده 

دنبال راهی هستم واسه نوشتن و یا ایجاد و یا حذف فایل از روی کارت حافظه هستم 

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
basic 4 android    77

کاربر رو به رشد

در 16 دقیقه قبل، sbr گفته است :

سلامی مجدد 

خب راه حلش رو پیدا کردم 

از اندرود 6 به بالا ران تایم پرمیژن های زیر 




<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

تنها برای حافظه داخلی گوشی هستند ولی برای دسترسی نوشتن و یا حذف فایل ها از روی کارت حافظه علاوه بر دسترسی های بالا باید از Storage Access Framwork استفاده کرد 

ZNDgX.png

 

با این کد متونید framwork رو اجرا کنید  


startActivityForResult(new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), 42);

و وقتی مسیر اصلی کارت حافظه رو ذخیره کردید ، به صورت خودکار متد نتیجه اجرا میشه ↓↓↓↓↓↓↓↓


@Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {


        if (resultCode != RESULT_OK)
            return;
        else {
            Uri treeUri = resultData.getData();
            DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
            grantUriPermission(getPackageName(), treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
            getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

// ذخیر کردن مقدار یوری در شیرد پرفرنس
            preferences = getSharedPreferences("MyShared" , MODE_PRIVATE) ;
            SharedPreferences.Editor editor = preferences.edit() ;
            editor.putString("Dir" , treeUri.toString());
            editor.commit() ;

        }
    }

همونطور که توی کد مشخص هست ابتدا چک میکنه که مسیری رو انتخاب کردید یا نه 

بعد از طریق Uri مقدار اینتنت رو دریافت میکنه و توی Sharedprefrences ذخیره میکنیم تا هر موقع لازم داشتیم دوباره بگیریمش

اما نکته خیل مهم اینه که به توصه گوگل باید از DocumentFile به جای File استفاده کنید البته داکیومنت فایل هم کار باهاش سخت نیست و اکثر متد های File رو داره 

هر جا هم خواستیم استفاده کنیم مقدار ذخیره شده توی SharedPrefrences رو که به صورت رشته ذخیره کرده بودیم مگیریم و دوباره به Uri تبدیل میکنیم و در نهایت به  DocumentFile میدیم 


      Uri uri = Uri.parse(preferences.getString("Dir" ,""));

        DocumentFile file = DocumentFile.fromTreeUri(MainActivity.this , uri ) ;
		file.ListFiles[]

خب مسیر انتخاب شده و ذخیره شده توسط Uri رو به DocumentFile دادیم و الان مسیر اصلی کتابخونه رو داریم و با داکیومنت فایل  مث همون File عمل مکنیم

 

و الان دسترسی کامل به کارت حافظه  رو داریم 

امیدوارم به کارتون بیاد 

البته من خودم خواستم از متدDelete استفاده کنیم اما حواسم نبود و یه خط رو جا انداختم و نتیجه این شد که اشتباها  مسیر اصیلی کارت حافظم رو دادم به متد Delete و الان کارت حافظم خیلی شیک و مجلسی فرمت شد ☺

دقت کنید به مسیر هاتون 

 

 

با اجازه دوستان و اساتید ، به عنوان بهترین پاسخ انتخاب میکنم 

خوب دوست عزیز زحمت سورس بیسیکش رو بکش

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
  • 0
basic 4 android    77

کاربر رو به رشد

uppppppppppppppp

 

در در 9 مرداد 1398 در 21:00، basic 4 android گفته است :

خوب دوست عزیز زحمت سورس بیسیکش رو بکش

 

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


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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

مهمان
پاسخ به این سوال ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


×
×
  • جدید...