2017-07-22 20 views
12

मैं पथएंड्रॉयड में बाहरी संग्रहण से फ़ाइल को नष्ट नहीं कर सकते हैं प्रोग्राम के रूप में

/storage/714D-160A/Xender/image/Screenshot_commando.png 

मैं अब तक क्या किया है पर स्थित एक फ़ाइल को नष्ट करने के लिए कोशिश कर रहा हूँ:

try{ 
     String d_path = "/storage/714D-160A/Xender/image/Screenshot_commando.png"; 
     File file = new File(d_path); 
     file.delete(); 

    }catch(Exception e){ 

     e.printStackTrace(); 
    } 

और फ़ाइल उसके स्थान पर (हटाए :() मालसूची फ़ाइल में

इसके अलावा, मैं दे दिया है की अनुमति पर अब भी है।

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.WRITE_INTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.STORAGE" /> 
+0

आप क्या त्रुटि प्राप्त कर रहे हैं? अपना लॉगकैट विवरण जोड़ें। – huk

+0

यदि आप एंड्रॉइड एम या इससे अधिक के डिवाइस पर परीक्षण कर रहे हैं, तो आपको रनटाइम अनुमति की आवश्यकता होगी। –

+0

मैं एंड्रॉइड एम – Secret

उत्तर

5
public static boolean delete(final Context context, final File file) { 
    final String where = MediaStore.MediaColumns.DATA + "=?"; 
    final String[] selectionArgs = new String[] { 
      file.getAbsolutePath() 
    }; 
    final ContentResolver contentResolver = context.getContentResolver(); 
    final Uri filesUri = MediaStore.Files.getContentUri("external"); 

    contentResolver.delete(filesUri, where, selectionArgs); 

    if (file.exists()) { 

     contentResolver.delete(filesUri, where, selectionArgs); 
    } 
    return !file.exists(); 
} 
+0

में स्थित एक और फ़ाइल का परीक्षण करें क्या यह विधि Android 5.0 और उसके बाद वाले Android डिवाइसों के साथ काम करेगी? – Rahulrr2602

+1

हां, यह एंड्रॉइड 5.0 और ऊपर काम करता है। – Secret

+0

आपको बहुत बहुत धन्यवाद। – Rahulrr2602

3

उपयोग Environment.getExternalStorageDirectory().getAbsolutePath() के बजाय कठिन कोडिंग भंडारण पथ

String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath(); 
File f = new File(baseDir + "/714D-160A/Xender/image/Screenshot_commando.png"); 
boolean d = f.delete(); 
+0

आपके उत्तर के लिए धन्यवाद, लेकिन मैं बाहरी संग्रहण (मेमोरी कार्ड) फ़ाइल को हटाना चाहता हूं। और बूलियन झूठी वापसी, फ़ाइल है अभी भी इसकी जगह पर (हटाया नहीं गया है) .. – Secret

+0

@ सेक्रेट क्या आपने 'Environment.getExternalStorageDirectory() का परीक्षण किया था।'/storage' के बजाय getAbsolutePath() '? – SiSa

+0

हाँ मैं परीक्षण करता हूं लेकिन मेरे लिए काम नहीं करता ... @ SiSa – Secret

9

मीडिया फ़ाइलों को हटाने के ContentResolver का उपयोग करना गलत है और उपयोगकर्ता के लिए कई समस्याओं प्रदान करता है।
पर से अधिक एंड्रॉइड संस्करणों पर ContentResolver से अपनी जानकारी को हटाकर आप sd-card पर फ़ाइल को हटा नहीं सकते हैं।
यह केवल KitKat(4.4) से पहले एंड्रॉइड संस्करणों पर काम करता है।
यही कारण है कि एंड्रॉइड टीम ने DocumentProvider प्रदान किया।

क्यों contentResolver.delete(...) गलत है?
1. भरता अप sd-card
जब आप 4.3 से अधिक एंड्रॉयड संस्करणों पर ContentResolver द्वारा sd-card पर एक मीडिया फाइल को हटाने का प्रयास वास्तविक मीडिया फ़ाइल अछूता रहेगा, क्योंकि contentResolver.delete(...) दृष्टिकोण केवल जानकारी को हटा देगा (नाम, दिनांक, पथ ...) और आप अपने sd-card पर अनियंत्रित मीडिया फ़ाइलों को समाप्त कर देंगे जो ContentResolver को उनके अस्तित्व के बारे में कोई जानकारी नहीं है और यही कारण है कि आप उन्हें अपनी गैलरी में नहीं देख पाए और आपको लगता है कि वे ' जब भी वे अभी भी वहां हैं, इस दृष्टिकोण के साथ हटा दिए गए हैं और sd-card भरते हैं जब उपयोगकर्ता sd-card पर मीडिया फ़ाइल को हटाने का प्रयास करता है।

2. मीडिया फ़ाइलें (छवि, वीडियो, gifs ...) गैलरी के लिए वापस आ जाएगा
वहाँ कई क्षुधा हैं बाहर वहाँ विशेष रूप से गैलरी और फ़ाइल प्रबंधक जो कि इन अपंजीकृत मीडिया फ़ाइलों को मिलेगा और जोड़ देगा उन्हें ContentResolver पर फिर से उनके सामान्य व्यवहार के रूप में उपयोगकर्ता मानते हैं कि उनकी अवांछित मीडिया फाइलें चली गई हैं। निश्चित रूप से कोई उपयोगकर्ता नहीं चाहता है कि उसकी धारण की गई छवियां या वीडियो प्रदर्शन के बीच में दिखाई दें।

तो sd-card पर मीडिया फ़ाइलों को निकालने का सही तरीका क्या है?
ठीक है, DocumentProvider के उपयोग के साथ यह पहले से ही here का उत्तर दिया गया है।

+0

मूल प्रश्न ने कभी भी सामग्री रिसेल्वर का उल्लेख नहीं किया। आपका उत्तर इस पर क्यों ध्यान केंद्रित करता है? ओह। समझा। स्वीकृत उत्तर Contentresolver का उपयोग करता है। – Neo42

संबंधित मुद्दे