2017-05-12 128 views
0

我正在開發一個使用Xamarin Forms PCL項目的跨平臺應用程序。在此我需要在Android的內部存儲器中編寫一個文件,以便我可以訪問它。我給了寫入外部存儲權限,但是當我嘗試寫入文件時,它說Access被拒絕。Xamarin Forms:在Android設備的內部存儲器中寫入文件

這裏是我的嘗試:

Java.IO.File DataDirectoryPath = Android.OS.Environment.DataDirectory; 
string dirPath = DataDirectoryPath.AbsolutePath + "/MyFolder"; 
bool exists = Directory.Exists(dirPath); 
string filepath = dirPath + "/test.txt"; 
if (!exists) 
{ 
    Directory.CreateDirectory(dirPath); 
    if (!File.Exists(filepath)) 
    { 
     File.Create(filepath).Dispose(); 
     using (TextWriter tw = new StreamWriter(filepath)) 
     { 
      tw.WriteLine("The very first line!"); 
      tw.Close(); 
     } 
    } 
} 
+0

通常建議(和安全)使用應用程序的沙箱來存儲文件。如果您將文件存儲到設備存儲,而您的文件可以很容易地修改/刪除... – Milen

+0

'Directory.CreateDirectory(dirPath);'你不應該檢查返回值嗎?或者在試圖放入一個文件之前檢查目錄是否存在? – greenapps

+0

它說「訪問被拒絕」 – Sonali

回答

2

在此我需要寫在Android的內部存儲上的文件,這樣我可以acccess它。我給了寫入外部存儲權限,但是當我嘗試寫入文件時,它說Access被拒絕。

首先,權限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />用於外部存儲,因此它不適用於內部存儲。

基於您的代碼:

Java.IO.File DataDirectoryPath = Android.OS.Environment.DataDirectory; 

您使用Data Directory你的寫作,這個目錄是由系統擁有,有寫它沒有權限,還有就是對這個問題的SO幾次討論,例如:Data directory has no read/write permission in Android

因此,正如它在答案中的建議那樣,您可以使用getFilesDir()在Xamarin中寫入內部存儲,它的格式爲Android.Content.Context.FilesDir Property

更新:

我寫了一個基於你的代碼的一些代碼,它應該是一樣的,例如:

var dirPath = this.FilesDir + "/MyFolder"; 
var exists = Directory.Exists(dirPath); 
var filepath = dirPath + "/test.txt"; 
if (!exists) 
{ 
    Directory.CreateDirectory(dirPath); 
    if (!System.IO.File.Exists(filepath)) 
    { 
     var newfile = new Java.IO.File(dirPath, "test.txt"); 
     using (FileOutputStream outfile = new FileOutputStream(newfile)) 
     { 
      string line = "The very first line!"; 
      outfile.Write(System.Text.Encoding.ASCII.GetBytes(line)); 
      outfile.Close(); 
     } 
    } 
} 

我還檢查通過DDMS這個文件,也可以下看到文件夾:data\data\yourAPP\files\MyFolder\test.txt

enter image description here

我只是測試Xamarin.An droid項目,並沒有試圖使用DependencyService Xamarin.Forms,如果你想這樣做,只需將上述代碼中的this替換爲你的android環境。

+0

你有任何示例代碼來使用此屬性。請分享。 – Sonali

+0

@Sonali,我根據你的代碼編寫了一些代碼,請檢查我更新的答案。如果你覺得這有幫助,你可以標記這個答案嗎? –

+1

我用'Android.App.Application.Context.FilesDir'取代了'this'。這是對的嗎? – Sonali

相關問題