मैं उन फ़ाइलों को लिखने और पढ़ने की कोशिश कर रहा हूं जो एक पीसी से भी दृश्यमान और संपादन योग्य हैं जब एंड्रॉइड डिवाइस यूएसबी के माध्यम से इससे जुड़ा हुआ है। ये फ़ाइलें पीसी कनेक्शन के माध्यम से बनाई जा सकती हैं।

इसे प्राप्त करने के लिए मैं एक निर्देशिका के लिए एक स्थायी यूआरआई अनुमति लेने की कोशिश कर रहा हूं, और फिर उस निर्देशिका में फाइलें बना या पढ़ सकता हूं।

मैं "अवधारणा के प्रमाण" चरण में हूं।

मेनएक्टिविटी ऑनक्रेट विधि के अंदर मेरे पास निम्न कोड है:

startActivityForResult(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE).apply {
    flags = Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
}, GET_PERSISTABLE_PERMISSION)

जब मैं ते ऐप शुरू करता हूं, तो निर्देशिका पिकर पॉप अप हो जाता है और मैं एक निर्देशिका का चयन करने में सक्षम हूं।

मेनएक्टिविटी में मेरे पास भी है:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == GET_PERSISTABLE_PERMISSION && resultCode == Activity.RESULT_OK) {
        val uri = data?.data!!
        val contentResolver = applicationContext.contentResolver
        val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
        contentResolver.takePersistableUriPermission(uri, takeFlags)

        val tmpFile = File(uri.path, "debugTestFile.txt")
        tmpFile.createNewFile()
        tmpFile.appendText("árvíztűrő tükörfúrógép\r\n")
    }
    super.onActivityResult(requestCode, resultCode, data)
}

जिन चीजों की मैंने कोशिश की है:

  • uri.path के बजाय uri.toString()
  • flags = Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION or Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION आशय बनाते समय
  • एंड्रॉइड डिवाइस पर डाउनलोड, म्यूजिक, डीसीआईएम फोल्डर में अलग-अलग डायरेक्टरी दे रहा है, जब एंड्रॉइड द्वारा संकेत दिया जाए

मेरे सर्वोत्तम प्रयासों के बावजूद, tmpFile.createNewFile() लाइन "ऐसी कोई फ़ाइल या निर्देशिका नहीं" संदेश के साथ एक अपवाद फेंकती है।

    Process: hu.ibcs.android.scan, PID: 17309
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=-1, data=Intent { dat=content://com.android.externalstorage.documents/tree/primary:Music/GVtest flg=0xc3 }} to activity {hu.ibcs.android.scan/hu.ibcs.android.scan.MainActivity}: java.io.IOException: No such file or directory
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4846)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:4887)
        at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:51)
        at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2017)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7397)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)
     Caused by: java.io.IOException: No such file or directory
        at java.io.UnixFileSystem.createFileExclusively0(Native Method)
        at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:317)
        at java.io.File.createNewFile(File.java:1008)
        at hu.ibcs.android.scan.MainActivity.onActivityResult(MainActivity.kt:106)
        at android.app.Activity.dispatchActivityResult(Activity.java:8135)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:4839)
0
KalAnd 28 जिंदा 2021, 18:57
1
apply { flags = Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSIONइसका कोई मतलब नहीं है क्योंकि आप कुछ भी नहीं दे सकते क्योंकि आप प्रदाता नहीं हैं। कृपया निकालें। इसके बजाय आपको खुशी होनी चाहिए कि onActivityResult में आपको एक uri मिलता है और अनुमति दी जाती है जिसे आप लगातार ले सकते हैं। अच्छा आप ऐसा कर रहे हैं।
 – 
blackapps
28 जिंदा 2021, 19:06
1
val tmpFile = File(uri.path, "debugTestFile.txt") यह बकवास है क्योंकि uri.path एक फ़ाइल सिस्टम पथ नहीं है और आप इसके लिए फ़ाइल वर्ग का उपयोग नहीं कर सकते। इसके बजाय आपको प्राप्त यूरी के लिए DocumentFile चर का उपयोग करना चाहिए और फ़ोल्डर्स और फ़ाइलों को बनाने के लिए SAF या स्टोरेज एक्सेस फ्रेमवर्क विधियों का उपयोग करना चाहिए।
 – 
blackapps
28 जिंदा 2021, 19:08
How do I use a persistable permission that was granted by the Android user? आपका मतलब है: How do I use an uri of a file seleced by the Android user?
 – 
blackapps
28 जिंदा 2021, 19:27
सहायता के लिए धन्यवाद! यूरी एक निर्देशिका का है फ़ाइल नहीं। मैं एक संपूर्ण निर्देशिका तक पहुंच प्राप्त करने की कोशिश कर रहा हूं और इसमें कई अलग-अलग फाइलें बना/पढ़ रहा हूं।
 – 
KalAnd
29 जिंदा 2021, 13:03

1 उत्तर

सबसे बढ़िया उत्तर

सुझावों के लिए @blackapps को बहुत-बहुत धन्यवाद!

मैंने कोड को MainActivity.onCreate में बदल दिया है:

startActivityForResult(Intent(Intent.ACTION_OPEN_DOCUMENT_TREE), GET_PERSISTABLE_PERMISSION)

और MainActivity में कोड:

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
    if (requestCode == GET_PERSISTABLE_PERMISSION && resultCode == Activity.RESULT_OK) {
        val uri = data?.data!!
        val contentResolver = applicationContext.contentResolver
        val takeFlags: Int = Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION
        contentResolver.takePersistableUriPermission(uri, takeFlags)

        val pickedDir = DocumentFile.fromTreeUri(this, uri)
        val tmpFile = pickedDir.createFile("text/csv", "debugTestFile")
        val out: OutputStream? = getContentResolver().openOutputStream(tmpFile!!.uri)
        out?.write(("\uFEFF" + "árvíztűrő tükörfúrógép\r\n").toByteArray()) // adding BOM to the start for Excel to recognize utf8
        out?.close()
    }
    super.onActivityResult(requestCode, resultCode, data)
}

यह काम कर रहा है और ऐसा लग रहा है कि मैं यहां से आगे बढ़ सकता हूं।

0
KalAnd 29 जिंदा 2021, 13:50