2017-03-17 72 views
0

我正在嘗試讀取存儲在手機內存中的平面文件的內容。但是當我通過嘗試獲取文件地址時,我創建了File對象,這是不可讀的。訪問android中的文本文件

嘗試通過手動傳遞文件的地址來創建它,它的工作原理。

的問題是,我無法從URI,讓我的意圖

在這裏,我打開Android文件瀏覽器

btnAdjuntar.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
      intent.setType("text/plain"); 
      Intent chooser = Intent.createChooser(intent, "Elige App"); 
      if (chooser.resolveActivity(getPackageManager()) != null) { 
       startActivityForResult(chooser, COD_ABRIR_FICHERO); 
      } 
     } 
    }); 

在這裏,我收到意向

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == COD_ABRIR_FICHERO) { 
     if (resultCode == RESULT_OK) { 
      String ruta = data.getData().getPath(); 
      String lectura; 
      try { 
       lectura = leerArchivo(ruta); 
      } catch (Exception e) { 
       lectura = e.getMessage(); 
      } 
      Toast.makeText(getApplicationContext(), lectura, Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
該地址

拋出異常,並且您有此消息: /document/primary:Documents/PruebaArchivo.txt:打開失敗:ENOENT(沒有這樣的文件或目錄)

方法leerArchivo

public String leerArchivo(String ruta) throws FileNotFoundException, IOException { 
    String cadena; 
    String lectura = ""; 

    File file = new File(ruta); 
    FileReader f = new FileReader(file); 
    BufferedReader b = new BufferedReader(f); 
    while ((cadena = b.readLine()) != null) { 
     lectura += cadena; 
    } 
    b.close(); 
    return lectura; 
} 

已權限讀取外部存儲器被接受

回答

0

您可以從一個URI打開一個InputStream:

InputStream is = getContentResolver().openInputStream(uri); 

然後包裹輸入流,以創建BufferedReader:

BufferedReader b = new BufferedReader(new InputStreamReader(is)); 
while ((cadena = b.readLine()) != null) { 
    lectura += cadena; 
} 
b.close(); 

這種方式你永遠不需要獲取文件的地址。您可以指定編碼(例如「UTF-8」)作爲InputStreamReader構造函數的第二個參數。

+0

非常感謝,它一直非常有幫助 –

0

但是,當我通過嘗試獲取文件地址,並創建File對象時,這是不可讀的。

您沒有收到文件。你正在獲得內容。您正在獲得Uri。 A Uri不是一個文件。

String ruta = data.getData().getPath(); 

這條線是,如果Uri的方案是file時纔有用。在你的情況下,該計劃可能是content

使用ContentResolveropenInputStream()可獲得關於內容的InputStream。無論Urifile方案還是content方案,這都有效。