ทดสอบโดยทางโปรแกรมว่าใน Android 10+ การเข้าถึงที่เก็บข้อมูลภายนอกแบบเดิมนั้นถูกปิดใช้งาน


12

มีการเรียก API แบบง่าย ๆ ที่จะบอกฉันว่าแอปที่รันบน Android 10 หรือใหม่กว่าต้องใช้การเข้าถึงที่เก็บ Scoped หรือไม่นั่นคือถ้าการเข้าถึงไฟล์ปกติหรือที่รู้จักในชื่อ "Legacy External Storage" ถูกปิดใช้งานหรือไม่ โปรดทราบว่าแม้ว่าแอปใน AndroidManifest.xml จะประกาศส่วน:

  android:requestLegacyExternalStorage="true"

การเข้าถึงไฟล์อาจยังถูกปฏิเสธเนื่องจากการเปลี่ยนแปลงนโยบายของ Google ในอนาคตดังนั้นการทดสอบค่านี้จึงไม่มีประโยชน์ วิธีเดียวที่ฉันพบคือการทดสอบว่าไดเรกทอรีรากของที่เก็บข้อมูลภายนอกนั้นสามารถอ่านได้หรือไม่ แต่สำหรับแอปนั้นจะต้องขอสิทธิ์ในการเก็บข้อมูลก่อนซึ่งเป็นประโยชน์สำหรับสิ่งอื่นใดหากปิดใช้งานที่เก็บข้อมูลดั้งเดิม

public static boolean mustUseScopedStorage() {
    // Impractical must first ask for useless Storage permission...
    File exSD = Environment.getExternalStorageDirectory();
    return !exSD.canRead(); // this test works only if Storage permission was granted.
}

ฉันคิดว่าฉันเคยเห็น API ใหม่เพื่อตรวจจับสิ่งนี้ แต่ไม่พบบทความนั้นอีกต่อไป ...


an app running on Android 10 or later must use Scoped Storage access? คุณช่วยอธิบายความหมายของสิ่งนั้นได้อย่างไร คุณมีความคิดในเรื่องใด ฉันรู้ว่าตัวอย่างเช่น Storage Volumes และ Storage Manager ที่นำมาให้ N นั้นเลิกใช้แล้วสำหรับ Q.
blackapps

ฉันหมายถึงการเข้าถึงไฟล์ Java ปกตินอกเหนือจาก sandbox ที่กำหนดให้กับแอปโดยระบบหรือเช่นใน C / C ++ รหัส JNI fopen ("filename.ext", โหมด); จะไม่ทำงาน (ปฏิเสธการเข้าถึง) หากเส้นทางของไฟล์อยู่นอกเหนือไดเรกทอรีแอปที่กำหนดโดยระบบ ทีนี้มันจะทำงานบน Android 10 ตอนนี้ถ้าคุณใช้ android: requestLegacyExternalStorage = "true" ในไฟล์ Manifest แต่มันเป็นวิธีแก้ปัญหาชั่วคราวและอาจปิดการใช้งานในปีหน้า อ่านเพิ่มเติมเช่นandroidcentral.com/what-scoped-storage-android-q
gregko

แม้ในบทความนั้นยังไม่ชัดเจนว่าพื้นที่เก็บข้อมูลที่กำหนดขอบเขตจะเป็นอย่างไร
blackapps

@blackapps บางทีบทความนี้อาจอธิบายได้ดีกว่า: developer.android.com/training/data-storage/files/…
gregko

ตกลง. จำกัด การเข้าถึงไดเรกทอรีส่วนตัวของแอพเท่านั้น
blackapps

คำตอบ:


8

คุณสามารถใช้สองวิธีนี้จากandroid.os.Environment:

  • isExternalStorageLegacy(File path)

    ส่งคืนว่าสื่อบันทึกหน่วยความจำแบบแชร์ / ภายนอกที่เส้นทางที่กำหนดเป็นมุมมองแบบดั้งเดิมที่มีไฟล์ที่แอพไม่ได้เป็นเจ้าของ

  • isExternalStorageLegacy()

    ส่งคืนว่าสื่อเก็บข้อมูลภายนอก / หลักจัดเก็บเป็นมุมมองแบบดั้งเดิมที่มีไฟล์ที่แอปไม่ได้เป็นเจ้าของ

ค่านี้อาจแตกต่างจากค่าที่ร้องขอโดยrequestLegacyExternalStorageในรายการของแอปเนื่องจากแอปอาจสืบทอดสถานะดั้งเดิมของแอพนั้นขึ้นอยู่กับเวลาที่ติดตั้งครั้งแรก

แอปที่ไม่ใช่แบบดั้งเดิมสามารถค้นพบและอ่านสื่อที่เป็นของแอพอื่น ๆMediaStoreได้ต่อไป

ในกรณีที่คุณค้นพบว่าคุณมีสิทธิ์เข้าถึงที่จัดเก็บแบบดั้งเดิมฉันคิดว่าเป็นการดีกว่าที่จะย้ายข้อมูลไปยังที่จัดเก็บข้อมูลที่กำหนดขอบเขตแล้วใช้แทนการจัดเก็บแบบเดิมเนื่องจากที่เก็บข้อมูลแบบดั้งเดิมอาจหยุดทำงานโดยไม่มีการเตือนล่วงหน้า


1
ขอบคุณ @Zaffy นี่คือคำตอบที่ฉันต้องการ มันทำงานได้อย่างสมบูรณ์แบบและไม่จำเป็นต้องขอ "การเข้าถึงพื้นที่เก็บข้อมูล"
gregko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.