Android 11: จะเขียนไฟล์สื่อผสมอย่างไร/ที่ไหนที่ควรถอนการติดตั้ง

ฉันกำลังเขียนแอปกล้องกรณีใช้งานเฉพาะที่กำหนดเป้าหมายเป็น Android 11 เมื่อฉันกดบันทึก ฉันต้องการสร้างไดเร็กทอรีใหม่ที่ไหนสักแห่ง (ด้วยชื่อตามการประทับเวลา ฯลฯ ) ที่มีวิดีโอผลลัพธ์รวมถึงฮีปทั้งหมด ไฟล์ YAML/JSON/CSV แบบกำหนดเองอื่นๆ ที่ถูกเขียนระหว่างกระบวนการบันทึกด้วย (ตามตรรกะของเอาต์พุตของการบันทึก)

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

เมื่อดูภาพรวมที่นี่ ฉันพบว่า:

  • ไฟล์เฉพาะแอป, การตั้งค่าแอป และ ฐานข้อมูล ไม่เหมาะอย่างชัดเจน เหนือสิ่งอื่นใด ไฟล์เหล่านี้ไม่สามารถถอนการติดตั้งได้
  • เอกสารและไฟล์อื่นๆ ใช้ Storage Access Framework แต่ไม่เหมาะเนื่องจากต้องใช้ตัวเลือกไฟล์ระบบทุกครั้งที่คุณต้องการเขียนบางสิ่ง สิ่งนี้จะรบกวนขั้นตอนการบันทึก/ประสบการณ์ผู้ใช้ และไม่มีแอปกล้องใดทำงานเช่นนั้น
  • ชุดข้อมูล/BlobStoreManager (ที่นี่) ก็ไม่เป็นเช่นนั้น เหมาะสมกับการใช้งานของฉัน
  • MediaStore API ดูเหมือนว่าควรจะเป็นอันหนึ่ง แต่ดูเหมือนจะไม่สามารถทำสิ่งที่ฉันต้องการได้ในแง่ของการสร้างไดเร็กทอรีเอาต์พุตทั้งหมด รวมถึงไฟล์ข้อความ YAML/JSON/CSV ที่กำหนดเอง ทั้งหมดนั้น อยู่ด้วยกัน. เป้าหมายของฉันคือผู้ใช้สามารถไปที่ File Explorer นำทางไปยังโฟลเดอร์ที่เหมาะสม และคัดลอกโฟลเดอร์ที่มีการบันทึกไปยังคอมพิวเตอร์หรืออะไรก็ตามได้ตลอดเวลา เพื่อบันทึก/ดูข้อมูล แม้แต่ MediaStore.Files ก็ไม่รับประกันว่าคุณจะสามารถทำเช่นนั้นได้จริงหากแอปของคุณใช้พื้นที่เก็บข้อมูลที่กำหนดขอบเขต

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

ตัวเลือกที่ดีที่สุดของฉันที่นี่คืออะไร? มีตัวเลือกที่ฉันพลาดไปหรือไม่?


comment
MANAGE_EXTERNAL_STORAGE ก็ไม่พึงปรารถนาเช่นกันเพราะเหตุนี้: developer.android.com/training/data-storage/   -  person pallgeuer    schedule 10.01.2021


คำตอบ (2)


แต่ไม่เหมาะเนื่องจากต้องใช้ตัวเลือกไฟล์ระบบทุกครั้งที่คุณต้องการเขียนบางสิ่ง

No.

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

person CommonsWare    schedule 10.01.2021
comment
ฉันเข้าใจถูกต้องหรือไม่ว่าแอปจำเป็นต้องให้ผู้ใช้เลือกแผนผังเอกสารเพียงครั้งเดียวเท่านั้น หรือผู้ใช้จำเป็นต้องเลือกโครงสร้างเอกสารหนึ่งครั้งต่อการเรียกใช้แอป อัพเดทแอพหนึ่งครั้งต่อครั้ง? ติดตั้งใหม่หนึ่งครั้งต่อแอป? - person pallgeuer; 11.01.2021
comment
เพียงครั้งเดียวเท่านั้น และหนึ่ง==หนึ่ง - person blackapps; 11.01.2021
comment
@pallgeuer: คุณจะต้องขอแผนผังอีกครั้งหากแอปของคุณถูกถอนการติดตั้งและติดตั้งใหม่ มีกรณี Edge ที่คุณจะต้องขอแผนผังอีกครั้ง เช่น หากผู้ใช้ลบแผนผังเดิม มิฉะนั้น หากคุณใช้ takePersistableUriPermission() คุณจะสามารถเข้าถึงแผนผังได้อย่างถาวร - person CommonsWare; 11.01.2021
comment
@CommonsWare มีตัวอย่างโค้ดที่ใช้งานได้สำหรับการเขียนไฟล์ในที่จัดเก็บข้อมูลภายนอกแล้วอ่านไฟล์จากตำแหน่งนั้นสำหรับ api ทั้งหมดรวมถึง android 11 หรือไม่ และคำถามเพิ่มเติมในการอ่านเอกสารนั้น ถ้าต้องถามผู้ใช้ทุกครั้ง ? หรือครั้งเดียว? วิธีการเป็นอย่างไรบ้าง? - person Noor Hossain; 15.02.2021

คุณสามารถสร้างไดเร็กทอรีของคุณเองในไดเร็กทอรีสาธารณะ เช่น DCIM, รูปภาพ, เพลง หรือภาพยนตร์ ด้วยวิธีไฟล์แบบคลาสสิก

person blackapps    schedule 10.01.2021
comment
ใช่ แต่เว้นแต่ฉันจะเข้าใจผิดอย่างที่ฉันบอกไปแล้ว นั่นต้องได้รับอนุญาตจาก MANAGE_EXTERNAL_STORAGE ซึ่งไม่ใช่ตัวเลือก: support.google.com/googleplay/android-developer/answer/9956427 - person pallgeuer; 11.01.2021
comment
ไม่ นั่นไม่ได้ต้องการสิ่งนั้น แล้วทำไมยังไม่ลองล่ะ? - person blackapps; 11.01.2021
comment
ใช่ ฉันทำ และเช่นเดียวกับที่บันทึกไว้อย่างชัดเจนในเอกสารของ Android ความพยายามในการเขียนไฟล์แบบคลาสสิกล้มเหลว (โดยไม่อนุญาตให้ดำเนินการ EPERM) เหลือเพียงตัวเลือกในการเพิ่ม WRITE_EXTERNAL_STORAGE หรือ MANAGE_EXTERNAL_STORAGE เพื่อหวังว่าจะใช้งานได้ และหากคุณอ่านเอกสารประกอบ คุณจะเห็นว่า: หากแอปของคุณกำหนดเป้าหมายเป็น Android 11 (API ระดับ 30) หรือสูงกว่า สิทธิ์ WRITE_EXTERNAL_STORAGE จะไม่มีผลใดๆ ส่งผลต่อการเข้าถึงพื้นที่เก็บข้อมูลของแอปของคุณ คุณอาจไม่รู้ว่ามีการเปลี่ยนแปลงใน Android 11 หรือไม่ - person pallgeuer; 11.01.2021
comment
แสดงรหัสของคุณ คุณไม่สามารถสร้างไฟล์ในไดเร็กทอรีเหล่านั้นภายใต้ Android 11 แต่คุณสามารถสร้างโฟลเดอร์ของคุณเองที่นั่น จากนั้นจึงสร้างไฟล์ในโฟลเดอร์ของคุณได้ เราไม่รู้ว่าคุณทำอะไร คุณต้องมีสิทธิ์ตามปกติเหมือนก่อน Android 10 - person blackapps; 11.01.2021
comment
ฉันใช้ Environment.getExternalStoragePublicDirectory(...) เพื่อรับไดเร็กทอรี DCIM (ซึ่งเลิกใช้แล้ว - จะแทนที่ได้อย่างไร) จากนั้นใช้ File::mkdir เพื่อสร้างโฟลเดอร์ใน DCIM นั่นได้ผล การสร้าง FileWriter ให้กับไฟล์ในพาธนั้นล้มเหลวด้วย java.io.FileNotFoundException: /storage/emulated/0/DCIM/blah/stuff.yaml: open failed: EPERM (Operation not permitted) โดยที่ฉันตรวจสอบในตัวจัดการไฟล์ว่ามีโฟลเดอร์ blah มีอยู่จริงจาก mkdir ก่อนหน้า เพื่อให้แน่ใจ ฉันได้ลองใช้หลังจากใช้สิทธิ์ WRITE_EXTERNAL_STORAGE กับแอปของฉันสำเร็จแล้ว (ฉันแตะอนุญาต) - person pallgeuer; 11.01.2021
comment
ดังนั้น หากคุณมีรหัสใด ๆ ที่ทำสิ่งที่คุณอ้างว่าเป็นไปได้สำเร็จ (ทดสอบภายใต้ Android 11) โปรดโพสต์ไว้เพื่อประโยชน์ของชุมชน! - person pallgeuer; 11.01.2021
comment
รหัสเดียวกับที่ฉันลองใช้ใช้งานได้ดีอย่างสมบูรณ์หากแอปมีสิทธิ์ MANAGE_EXTERNAL_STORAGE ดังนั้นจึงไม่มีการพิมพ์ผิดในรหัสอย่างแน่นอน แต่การได้รับอนุญาตสำหรับแอปเช่นฉันนั้นเป็นไปไม่ได้สำหรับนโยบายใหม่ของ Google - person pallgeuer; 11.01.2021
comment
ลอง /storage/emulated/0/DCIM/blah/stuff.jpg เนื่องจาก DCIM ไม่อนุญาตให้ใช้เคล็ดลับไฟล์ทั้งหมด - person blackapps; 11.01.2021
comment
การใช้โฟลเดอร์ของคุณเองในไดเร็กทอรี Documents คุณสามารถเขียนไฟล์ *.yaml ได้ คุณควรลองทดสอบเพิ่มเติม! - person blackapps; 11.01.2021
comment
การทดสอบไม่ใช่คำพ้องความหมายสำหรับการคาดเดาพฤติกรรมที่เปราะบางซึ่งไม่ได้รับอนุญาต และไม่ควรเป็นเช่นนั้น ไม่ว่าในกรณีใด ฉันสามารถยืนยันได้ว่า jpg ในโฟลเดอร์ย่อยของ DCIM ใช้งานได้ และ yaml ในโฟลเดอร์ย่อยของ Documents ใช้งานได้ อย่างไรก็ตาม ไม่ควรพึ่งพาพฤติกรรมที่ไม่มีเอกสารดังกล่าวในแอปร้ายแรงที่ต้องการบำรุงรักษาตลอดหลายปีที่ผ่านมา - person pallgeuer; 12.01.2021