Android SAF(स्टोरेज एक्सेस फ्रेमवर्क): ट्रीयूरी से विशेष रूप से फ़ाइल उड़ी प्राप्त करें



file-io android-sdcard (1)

मैं बाहरी एसडी कार्ड के PersistableUriPermission ले रहा हूं और इसे आगे उपयोग के लिए संग्रहीत कर रहा हूं। अब मैं चाहता हूं कि जब उपयोगकर्ता मुझे मेरे आवेदन में फ़ाइलों की सूची से, फ़ाइल पथ प्रदान करता है, तो मैं दस्तावेज़ को संपादित करना और उसका नाम बदलना चाहता हूं।

इसलिए मेरे पास फ़ाइल का फ़ाइल पथ संपादित करने के लिए है।

मेरा सवाल यह है कि मुझे अपने ट्रीउरी से उस फाइल का उरई कैसे मिलेगा ताकि फाइल को एडिट किया जा सके।


एसडी कार्ड की फ़ाइलों तक पहुँचें

Sd-card का Uri पाने के लिए DOCUMENT_TREE संवाद का उपयोग करें।

उपयोगकर्ता को डायलॉग पर sd-card चुनने के बारे में सूचित करें। (चित्रों या जिफ एनिमेशन के साथ)

// call for document tree dialog
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT_TREE);

onActivityResult पर आपके पास चयनित निर्देशिका Uri । (SdCardUri)

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case REQUEST_CODE_OPEN_DOCUMENT_TREE:
            if (resultCode == Activity.RESULT_OK) {
                sdCardUri = data.getData();
             }
             break;
     }
  }

अब देखना होगा कि क्या उपयोगकर्ता

ए। एसडी कार्ड का चयन किया

ख। sd-card को चुना जो हमारी फ़ाइल चालू है (कुछ डिवाइस में कई sd-card हो सकते हैं)।

हम पदानुक्रम के माध्यम से फाइल को खोजकर, sd रूट से हमारी फाइल तक, दोनों की जाँच करते हैं। यदि फ़ाइल मिली है, तो a और b दोनों स्थितियों का अधिग्रहण किया गया है।

//First we get `DocumentFile` from the `TreeUri` which in our case is `sdCardUri`.
DocumentFile documentFile = DocumentFile.fromTreeUri(this, sdCardUri);

//Then we split file path into array of strings.
//ex: parts:{"", "storage", "extSdCard", "MyFolder", "MyFolder", "myImage.jpg"}
// There is a reason for having two similar names "MyFolder" in 
//my exmple file path to show you similarity in names in a path will not 
//distract our hiarchy search that is provided below.
String[] parts = (file.getPath()).split("\\/");

// findFile method will search documentFile for the first file 
// with the expected `DisplayName`

// We skip first three items because we are already on it.(sdCardUri = /storage/extSdCard)
for (int i = 3; i < parts.length; i++) {
    if (documentFile != null) {
        documentFile = documentFile.findFile(parts[i]);
    }
  }

if (documentFile == null) {

    // File not found on tree search
    // User selected a wrong directory as the sd-card
    // Here must inform user about how to get the correct sd-card
    // and invoke file chooser dialog again.

 } else {

    // File found on sd-card and it is a correct sd-card directory
    // save this path as a root for sd-card on your database(SQLite, XML, txt,...)

    // Now do whatever you like to do with documentFile.
    // Here I do deletion to provide an example.


    if (documentFile.delete()) {// if delete file succeed 
        // Remove information related to your media from ContentResolver,
        // which documentFile.delete() didn't do the trick for me. 
        // Must do it otherwise you will end up with showing an empty
        // ImageView if you are getting your URLs from MediaStore.
        // 
        Uri mediaContentUri = ContentUris.withAppendedId(
                MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                longMediaId);
        getContentResolver().delete(mediaContentUri , null, null);
    }


 }

ध्यान दें:

आपको अपने मैनिफ़ेस्ट के अंदर और ओएस> = मार्शमैलो ऐप के अंदर बाहरी स्टोरेज के लिए एक्सेस की अनुमति देनी होगी। https://.com/a/32175771/2123400

एसडी कार्ड की फ़ाइलें संपादित करें

यदि आप अपने लिए ऐसा करने के लिए किसी अन्य ऐप का आह्वान करना चाहते हैं, तो अपने sd-card पर किसी मौजूदा छवि को संपादित करने के लिए आपको किसी भी उपरोक्त कदम की आवश्यकता नहीं है।

यहां हम छवियों को संपादित करने की क्षमता के साथ सभी गतिविधियों (सभी स्थापित एप्लिकेशन से) को आमंत्रित करते हैं। (प्रोग्रामर अन्य एप्लिकेशन (गतिविधियों) से एक्सेसिबिलिटी प्रदान करने के लिए अपनी क्षमताओं के प्रदर्शन में अपने ऐप को चिह्नित करते हैं।

अपने editButton पर क्लिक करें घटना:

String mimeType = getMimeTypeFromMediaContentUri(mediaContentUri);
startActivityForResult(Intent.createChooser(new Intent(Intent.ACTION_EDIT).setDataAndType(mediaContentUri, mimeType).putExtra(Intent.EXTRA_STREAM, mediaContentUri).addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION), "Edit"), REQUEST_CODE_SHARE_EDIT_SET_AS_INTENT);

और यह है कि कैसे mimeType पाने के लिए:

public String getMimeTypeFromMediaContentUri(Uri uri) {
    String mimeType;
    if (uri.getScheme().equals(ContentResolver.SCHEME_CONTENT)) {
        ContentResolver cr = getContentResolver();
        mimeType = cr.getType(uri);
    } else {
        String fileExtension = MimeTypeMap.getFileExtensionFromUrl(uri
                .toString());
        mimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(
                fileExtension.toLowerCase());
    }
    return mimeType;
}

ध्यान दें:

एंड्रॉइड किटकैट (4.4) पर उपयोगकर्ता को एसडी-कार्ड का चयन करने के लिए मत कहो क्योंकि एंड्रॉइड DocumentProvider इस संस्करण पर लागू नहीं है, इसलिए हमारे पास इस दृष्टिकोण के साथ एसडी-कार्ड तक पहुंच का कोई मौका नहीं है। DocumentProvider https://developer.android.com/reference/android/provider/DocumentsProvider.html लिए API स्तर https://developer.android.com/reference/android/provider/DocumentsProvider.html
मुझे कुछ भी नहीं मिला जो Android किटकैट (4.4) पर काम करता है। अगर आपको किटकैट के साथ कुछ उपयोगी लगा तो कृपया हमारे साथ साझा करें।

किटकैट से नीचे के एसडी-कार्ड तक पहुँच पहले से ही ओएस द्वारा प्रदान की गई है।





storage-access-framework