2015-05-07 211 views
1

我寫了一個方法,它創建一個文件並將數據寫入文件並存儲在內部存儲器中。當我得到文件的絕對路徑或路徑時[我已經添加了日誌消息來試驗文件上的操作],它顯示出該文件正在創建在根目錄下,並在/ data/data/mypackagename下創建/files/filename.txt。不過,我可以在DDMS上找到這些文件夾,在那裏我可以找到由我寫的方法創建的文件。但我無法打開該文件,因爲我沒有權限。如何將文件寫入Android內部存儲的文件夾?

當我看着我的Android設備,我找不到這些目錄。我查了一下堆棧溢出,有些人回答說內部存儲器中的/ data/data文件夾是隱藏的,要訪問它們,我必須爲我不想做的設備創建根目錄。

下一個方法:在Android設備上有一個名爲MyFiles的文件夾[我正在使用運行Android 4.4的Galaxy Tab 4進行測試]。在這個文件夾下有Device Storage目錄,其中包含文件,圖片,音樂,鈴聲,Android等各種文件夾。因此,相機,電子表格應用程序等應用程序能夠將圖片寫入或保存到圖片文件夾或文檔文件夾中的txt文件。同樣,我怎樣才能將我在函數中創建的文件寫入Documents文件夾或任何其他可通過設備訪問的文件夾。請幫助我如何做到這一點,任何幫助表示讚賞。

以下是我寫的代碼:

public void addLog(String power_level){ 
// creates a logFile in the root directory of the internal storage of the application. 
// If the file does not exists, then it is created. 
Log.d("AppendPower", "In addLog method"); 
//File logFile = new File(((Context)this).getFilesDir(), "logFile.txt"); 
File logFile = new File(getFilesDir(), "logFile.txt"); 
Log.d("FilesDir Path", getFilesDir().getAbsolutePath()); 
Log.d("FilesDir Name", getFilesDir().getName()); 
Log.d("Path on Android", logFile.getPath()); 
Log.d("Absolute Path on Android", logFile.getAbsolutePath()); 
Log.d("Parent", logFile.getParent()); 
if(!logFile.exists()){ 
    try{ 
     logFile.createNewFile(); 
    }catch(IOException io){ 
     io.printStackTrace(); 
    } 
} 
try{ 
    BufferedWriter writer = new BufferedWriter(new FileWriter(logFile, true)); 
    writer.write("Battery level reading"); 
    writer.append(power_level); 
    Log.d("Power_Level in try", power_level); 
    writer.newLine(); 
    writer.close(); 
}catch(IOException e){ 
    e.printStackTrace(); 
} 

}

回答

4

正如你已經想出寫入根目錄目錄在Android是不可能的,除非你的根設備。這就是爲什麼甚至一些Play商店中的應用程序在安裝應用程序之前要求獲得root權限。生根會使您的保修失效,所以如果您沒有嚴格的要求,我不會推薦它。

除了根目錄以外,您可以訪問Android文件管理器中可見的任何文件夾。

下面是你可以寫入SD一些數據 - 來自:https://stackoverflow.com/a/8152217/830719

使用這些代碼,你可以隨你需要設置權限的Android清單

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
寫在SD卡的文本文件

這是代碼:

public void generateNoteOnSD(String sFileName, String sBody){ 
    try 
    { 
     File root = new File(Environment.getExternalStorageDirectory(), "Notes"); 
     if (!root.exists()) { 
      root.mkdirs(); 
     } 
     File gpxfile = new File(root, sFileName); 
     FileWriter writer = new FileWriter(gpxfile); 
     writer.append(sBody); 
     writer.flush(); 
     writer.close(); 
     Toast.makeText(this, "Saved", Toast.LENGTH_SHORT).show(); 
    } 
    catch(IOException e) 
    { 
     e.printStackTrace(); 
     importError = e.getMessage(); 
     iError(); 
    } 
    } 

+0

非常感謝。它工作完美。 – ShellZero

0

1)如果你的目的是調試,你可能只是寫/sdcard/。它始終有效。 2)同樣,如果你的目的是調試,你可以嘗試設置你的應用程序目錄的讀取權限。前段時間,它在一些Android設備上爲我工作(但至少在一臺設備上無法使用)。

+0

所有的設備都沒有SD卡的權利。現在,每個人都擁有設備上的內部存儲空間。它不完全用於調試。我想將文件寫入內部存儲器! – ShellZero

+0

'/ sdcard /'將起作用。它通常意味着「內置」SD卡,這不是一個真正的SD卡,但爲了兼容性,它存在。如果你的java代碼寫入'/ sdcard /'和'adb pull'從相同的'/ sdcard /'中讀取,那麼它是否是真正的sd是沒有問題的。 – 18446744073709551615

+0

+1。是的,我知道了。非常感謝。我不知道內部存儲器不過是內置的SD卡。 – ShellZero

相關問題