[Android] Scoped Storage on Android 10 (Example Save File)

Panya.Bas
1 min readMay 24, 2020

ใน Android 10 ได้มีการปรับปรุงการใช้งาน และการเข้าถึง Device Storage เพื่อเพิ่มความปลอด และความสะดวกต่อการใช้งาน

  • การใช้งาน Storage แบบเดิม
    1. แต่ละแอปจะมี Private Directory เป็นของตัวเองใน Internal Storage เช่น android/data/com.package.xxx ซึ่งแอปอื่นจะไม่สามารถเข้ามา access ได้
    2. แอปจะขอ Permission ที่กว้างเกินไป เช่น WRITE_EXTERNAL_STORAGE ซึ่งทำให้แอปที่ได้ Permission นี้ไปสามารถจัดการไฟล์ที่อยู่ที่ External Storage ได้ทั้งหมด (ไฟล์ของชาวบ้านเขาด้วย)
    3. บางแอปที่ไปสร้างไฟล์ไว้ที่ External Storage แต่เมื่อแอปถูกลบแล้ว ไฟล์ที่แอปนั้นสร้างไว้ไม่ถูกลบตามไปด้วย ทำให้เกิดไฟล์ขยะในเครื่อง User
  • เพื่อเพิ่มความเป็นส่วนตัวของผู้ใช้งานมากขึ้น ทำให้เกิด Scoped Storage ขึ้นมา
  • Scoped Storage จะถูกใช้งานใน Android 10 ขึ้นไป และสำหรับแอป Android ที่ build ด้วย targetSdkVersion: 29 ขึ้นไปแล้วนั้น จะไม่สามารถใช้งาน File API ได้ ( เฉพาะ Device ที่ใช้ Android 10 ขึ้นไป) แต่สามารถ Workaround โดยการ set android:requestLegacyExternalStorage=”true” ใน AndroidManifest.xml. (แต่ไม่แนะนำนะ คือเดี๋ยวยังไงก็ต้องแก้นะ)
  • Let’s start code ด้วยการ Save File
    เราจะเริ่มด้วย Project ง่ายๆ โดยการ Capture หน้าจอแล้ว Save ลงเครื่องนะครับ

1. สร้าง function getBitmapFromVie() เพื่อใช้ Capture รูปภาพหน้าจอ แล้ว return เป็น Bitmap นะครับ

2. สร้าง function saveImageToStorage() เพื่อ save file ลง storage โดยจะเอารูป bitmap ที่ได้จาก function ด้านบนมาทำการ save ลง storage โดยจะมีการ set ค่าดังนี้
MediaStore.Images.Media.DISPLAY_NAME = ชื่อไฟล์ที่ต้องการบันทึก
MediaStore.Images.Media.MIME_TYPE = ชนิดของไฟล์
MediaStore.Images.Media.RELATIVE_PATH = Directory ที่ต้องการไปบันทึก
MediaStore.Images.Media.IS_PENDING = “1” คือการบอกว่ากำลัง Process ไฟล์อยู่ ส่วน “0” คือ Process เสร็จเรียบร้อยแล้ว

สังเกตได้ว่าการ save ไฟล์ลง storage นั้นไม่จำเป็นต้องขอ Permission จาก user เลย

github: https://github.com/kaowneaw/ScopeStorage

สรุป
Scoped Storage จะมาเปลี่ยนการทำงานกับ File ใน Android แอป ซึ่งแต่ก่อนจะใช้ File API ในการ Access File ด้วย Path โดยใช้การขอ Permission เพื่อ R/W แต่สำหรับ Android 10 ขึ้นไปใช้ไม่ได้แล้วนะ ควรไปต้องไปศึกษาเกี่ยวกับพวก MediaStore API สำหรับสร้างไฟล์ และพวก Storage Access Framework ที่เป็นพวก Picker ที่ใช้ในการแก้ไข หรือลบไฟล์นะ

--

--