2017-07-06 44 views
0

我想將某個文件保存到SDCard文檔文件夾的子文件夾中。我已經閱讀了很多文章,最後我沒有任何異常,看起來文件存儲沒有問題,但是當我將手機連接到comp時,仍然無法看到文件夾,也沒有文件。android棉花糖在SD卡上寫公共文件

編輯

文件創建

我在清單文件

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

我要求寫權限的授予權限發生這種情況只在設備上,在模擬器,用戶,它被授予。這裏這篇文章 This post helped me in granting permission

是我的代碼

if (!Environment.getExternalStorageState().equalsIgnoreCase(Environment.MEDIA_MOUNTED)) { 
     Toast.makeText(_ctx, "There is no external storage", Toast.LENGTH_LONG).show(); 
    } else { 
     File docfolder = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS); 
     docfolder.mkdirs(); 
     if (!docfolder.exists()) { 
      Toast.makeText(_ctx, "Documents doesn't exist", Toast.LENGTH_LONG).show(); 
     } 
     File folder = new File(docfolder, foldername); 
     folder.mkdirs(); //make if not exist 

     boolean isPresent = folder.exists(); 
     if (isPresent) { 
      File file = new File(folder.getAbsolutePath(), filename); 

      try { 
       OutputStream os = new FileOutputStream(file); 
       os.write(xml.getBytes()); 
       os.close(); 
      } catch (IOException e) { 
       Toast.makeText(_ctx, e.toString(), Toast.LENGTH_LONG).show(); 

       Log.w("ExternalStorage", "Error writing " + file, e); 
      } 
      catch (Exception e) { 
       Toast.makeText(_ctx, e.toString(), Toast.LENGTH_LONG).show(); 

       Log.w("ExternalStorage", "Error writing 2 " + file, e); 
      } 
     } else { 
      Toast.makeText(_ctx, "cannot make directory " + foldername, Toast.LENGTH_LONG).show(); 
      Log.w("ExternalStorage", "cannot make directory " + foldername); 
     } 

任何暗示的歡迎!

編輯

也許這個問題可能是這段代碼保存文件到這條道路?

/storage/emulated/0/Documents/IBHTrack/ibhTrack_GPX_20170706153858.xml

但是由於我使用的方法Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS),我不知道如何才能獲得真正的SD卡路徑

+0

https://stackoverflow.com/questions/32789157/how-to-write-files-to-external-public-storage-in-android -so-that-they-are-visibl – CommonsWare

+0

[如何在Android中將文件寫入外部公用存儲以使它們可以從Windows中看到?](https://stackoverflow.com/questions/32789157/how-to -write-files-to-external-public-storage-in-android-so-that-they-are-visibl) – Sanoop

+0

謝謝,但似乎mediascanner並沒有幫助我。 – pillesoft

回答

0

首先檢查權限:

void checkPermission(Activity thisActivity){ 
     // Here, thisActivity is the current activity 
     if (ContextCompat.checkSelfPermission(thisActivity, 
       Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 
      // Should we show an explanation? 
      if (ActivityCompat.shouldShowRequestPermissionRationale(thisActivity, 
        Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
       // Show an explanation to the user *asynchronously* -- don't block 
       // this thread waiting for the user's response! After the user 
       // sees the explanation, try again to request the permission. 
       Toast.makeText(MainActivity.this,"Permission denied, now log will not write in storage.",Toast.LENGTH_SHORT).show(); 

      } else { 
       // No explanation needed, we can request the permission. 
       ActivityCompat.requestPermissions(thisActivity, 
         new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
         101); 

      } 
     }else { 
       processFileLog(messageForLog); 

     } 
    } 

然後處理允許的響應:

@Override 
    public void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) { 
     switch (requestCode) { 
      case 101: { 
       // If request is cancelled, the result arrays are empty. 
       if (grantResults.length > 0 
         && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
        processFileLog(messageForLog); 
       } else { 
        // permission denied, boo! Disable the 
        // functionality that depends on this permission. 
        Toast.makeText(MainActivity.this,"Permission denied, now log will not write in storage.",Toast.LENGTH_SHORT).show(); 

       } 
       return; 
      } 

      // other 'case' lines to check for other 
      // permissions this app might request 
     } 
    } 

有了這個方法,你可以登錄你的數據到文件:

/** 
    * Tag value 
    */ 
    private static final String mTag = "Logs"; 

    /** 
    * File 
    */ 
    private static File mLogFolder = null; 

    private static void writeLog() { 
     if (isExternalStorageWritable()) { 
      mLogFolder = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + 
        "/app-client-logs"); 
      if (!mLogFolder.exists()) { 
       if (!mLogFolder.mkdirs()) { 
        System.out.println("Unable to create the log folder"); 
       } 
      } 
     } else { 
      System.out.println("SD Card not available for read and write"); 
     } 
    } 

    public static void processFileLog(final String message) { 
     writeLog(); 
     File file = new File(mLogFolder, mTag + ".log"); 
     try { 
      BufferedWriter buf = new BufferedWriter(new FileWriter(file, true)); 
      String currentDateTimeString = DateFormat.getDateTimeInstance().format(System.currentTimeMillis()); 
      buf.append("\nSafety Net Request "+currentDateTimeString).append(":\n").append(message); 
      buf.newLine(); 
      buf.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

謝謝,但我的情況也檢查了許可 – pillesoft