2012-10-12 12 views
7

में ईएसीसीईएस अनुमति अस्वीकार बाहरी एसडी कार्ड में फाइल लिखते समय मुझे एक त्रुटि मिल रही है ईएसीसीईएस अनुमति अस्वीकार कर दी गई है। मैंने अनुमति <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> सेट की है लेकिन जब मैं फ़ाइल पढ़ता हूं तो मैं इसे पढ़ने में सफलतापूर्वक सक्षम हूं लेकिन फ़ाइल लिखने में सक्षम नहीं हूं। कोड है कि मैं एसडी कार्ड में फाइल लिखने के लिए उपयोग कर रहा हूँ है:एंड्रॉइड

String path="mnt/extsd/Test"; 

       try{ 
        File myFile = new File(path, "Hello.txt");    //device.txt 
        myFile.createNewFile(); 
        FileOutputStream fOut = new FileOutputStream(myFile); 

        OutputStreamWriter myOutWriter = new OutputStreamWriter(fOut); 
        myOutWriter.append(txtData.getText()); 
        myOutWriter.close(); 
        fOut.close(); 
        Toast.makeText(getBaseContext(),"Done writing SD "+myFile.getPath(),Toast.LENGTH_SHORT).show(); 
       } catch (Exception e) { 
        Toast.makeText(getBaseContext(), e.getMessage(),Toast.LENGTH_SHORT).show(); 
        System.out.println("Hello"+e.getMessage()); 
       } 
      } 

बाह्य भंडारण कार्ड के लिए पथ mnt/extsd/ है। Thats क्यों मैं Environment.getExternalStorageDirectory().getAbsolutePath() का उपयोग करने में सक्षम नहीं हूं जो मुझे mnt/sdcard पथ दे रहा है और यह पथ मेरे टैबलेट में आंतरिक संग्रहण पथ के लिए है। कृपया सुझाव दें कि यह क्यों है n

उत्तर

13

जैसा कि मुझे याद है कि एंड्रॉइड को हनीकॉम से आंशिक बहु-स्टोरेज समर्थन मिला है, और प्राथमिक भंडारण (जिसे आप पर्यावरण से प्राप्त करते हैं .getExternalStorageDirectory, आमतौर पर आंतरिक ईएमएमसी का हिस्सा कार्ड) अभी भी WRITE_EXTERNAL_STORAGE की अनुमति से संरक्षित है, लेकिन द्वितीयक स्टोरेज (वास्तविक हटाने योग्य एसडी कार्ड की तरह) एक नई अनुमति android.permission.WRITE_MEDIA_STORAGE द्वारा संरक्षित हैं, और सुरक्षा स्तर हस्ताक्षरऑरसिस्टम है, this article में भी चर्चा देखें।

एपीआई स्तर 19, Google has added API से

यदि यह मामला है तो यह असंभव लगता है एक सामान्य एप्लिकेशन के लिए एक मंच हस्ताक्षर के बिना वास्तविक sdcard के लिए कुछ भी लिखने के लिए ...

+0

ठीक है..तो फिर लिखने का कोई अन्य तरीका है? – CodingDecoding

+0

क्या आपके पास अपने टेबलेट पर रूट पहुंच है? यदि अभी तक आप इस तरह का परीक्षण कर सकते हैं: 1) अपने ऐप को WRITE_MEDIA_STORAGE अनुमति का उपयोग करने दें और फिर इसे पुनर्निर्माण करें; 2) यदि यह पहले से स्थापित है, तो अपने ऐप को अनइंस्टॉल करें, फिर "adb root", "adb remount", "adb push youApp.apk /system/app/YouApp.apk" चलाएं, इससे आपका ऐप सिस्टम ऐप बन जाएगा; 3) अपना ऐप शुरू करें और जांचें कि टेस्ट कोड काम कर रहा है या नहीं।यदि हाँ प्लेटफ़ॉर्म प्रमाणपत्र द्वारा ऐप पर हस्ताक्षर करने या इसे सिस्टम ऐप बनाने के अलावा कोई और तरीका नहीं लगता है। या आप यह देखने के लिए इंतजार कर सकते हैं कि किसी और के पास बेहतर विचार है या नहीं। –

+0

जानकारी के लिए धन्यवाद। यह वास्तव में मदद की :) – CodingDecoding

7

  • Context.getExternalFilesDirs()
  • Context.getExternalCacheDirs()
  • Context.getObbDirs()

एप्लिकेशन, माध्यमिक बाह्य भंडारण उपकरणों के लिए लिखने के लिए अपने पैकेज-विशिष्ट निर्देशिका में छोड़कर के रूप में संश्लेषित अनुमतियों द्वारा अनुमति की अनुमति नहीं दी जानी चाहिए। इस तरह से लिखने में प्रतिबंध यह सुनिश्चित करता है कि एप्लिकेशन अनइंस्टॉल किए जाने पर सिस्टम फ़ाइलों को साफ़ कर सकता है।

पूर्ण पथ के साथ बाहरी एसडी कार्ड पर एप्लिकेशन विशिष्ट निर्देशिका प्राप्त करने के लिए निम्नलिखित दृष्टिकोण है। ऊपर से

Context _context = this.getApplicationContext(); 

File fileList2[] = _context.getExternalFilesDirs(Environment.DIRECTORY_DOWNLOADS); 

if(fileList2.length == 1) { 
    Log.d(TAG, "external device is not mounted."); 
    return; 
} else { 
    Log.d(TAG, "external device is mounted."); 
    File extFile = fileList2[1]; 
    String absPath = extFile.getAbsolutePath(); 
    Log.d(TAG, "external device download : "+absPath); 
    appPath = absPath.split("Download")[0]; 
    Log.d(TAG, "external device app path: "+appPath); 

    File file = new File(appPath, "DemoFile.png"); 

    try { 
     // Very simple code to copy a picture from the application's 
     // resource into the external file. Note that this code does 
     // no error checking, and assumes the picture is small (does not 
     // try to copy it in chunks). Note that if external storage is 
     // not currently mounted this will silently fail. 
     InputStream is = getResources().openRawResource(R.drawable.ic_launcher); 
     Log.d(TAG, "file bytes : "+is.available()); 

     OutputStream os = new FileOutputStream(file); 
     byte[] data = new byte[is.available()]; 
     is.read(data); 
     os.write(data); 
     is.close(); 
     os.close(); 
    } catch (IOException e) { 
     // Unable to create file, likely because external storage is 
     // not currently mounted. 
     Log.d("ExternalStorage", "Error writing " + file, e); 
    } 
} 

लॉग उत्पादन लगता है:

context.getExternalFilesDirs() : /storage/extSdCard/Android/data/com.example.remote.services/files/Download 

external device is mounted. 

external device download : /storage/extSdCard/Android/data/com.example.remote.services/files/Download 

external device app path: /storage/extSdCard/Android/data/com.example.remote.services/files/ 
0

मैं मैनिफ़ेस्ट फ़ाइल में uses-permission में android:maxSdkVersion="18" को हटाने के द्वारा इस समस्या का समाधान। आईई। इस का उपयोग करें:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

के बजाय:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" 
       android:maxSdkVersion="18" /> 
0

जांच करें कि उपयोगकर्ता बाह्य भंडारण की अनुमति वाले या नहीं है। यदि नहीं तो फ़ाइल को सहेजने के लिए कैश डीआईआर का उपयोग करें।

final boolean extStoragePermission = ContextCompat.checkSelfPermission(
       context, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       == PackageManager.PERMISSION_GRANTED; 

      if (extStoragePermission && 
     Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()) { 
       parentFile = context.getExternalFilesDir(Environment.DIRECTORY_PICTURES); 
      } 
      else{ 
       parentFile = new File(context.getCacheDir(), Environment.DIRECTORY_PICTURES); 
      }