2014-11-21 51 views
3

潔吉問題不能寫入外置SD卡,如何在運行KITKAT的設備上使用新的Lollipop SD卡訪問API?

正如Goolge Document提到要簡化運行奇巧設備代碼或更早的版本,你可以使用FROMFILE(文件),它模仿DocumentsProvider的行爲 以下代碼(新API)適用於棒棒糖,但如何使用kitkat的新API?

也期待在Kit-Kat issue (New API)

public class MyActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my); 
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); 
    startActivityForResult(intent, 42); 
} 

public void onActivityResult(int requestCode, int resultCode, Intent resultData) { 
    if (resultCode == RESULT_OK) { 
     Uri treeUri = resultData.getData(); 
     DocumentFile pickedDir = DocumentFile.fromFile(new File("/mnt/extSdCard/Test")); 

     // List all existing files inside picked directory 
     for (DocumentFile file : pickedDir.listFiles()) { 
      Log.d("Tag", "Found file " + file.getName() + " with size " + file.length()); 
     } 

     // Create a new file and write into it 
     DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel"); 
     OutputStream out = null; 
     try { 
      out = getContentResolver().openOutputStream(newFile.getUri()); 
      out.write("A long time ago...".getBytes()); 
      out.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.my, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 
    if (id == R.id.action_settings) { 
     return true; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

如何使用FROMFILE(文件)?

我試過,但說未能CREATEFILE:java.io.IOException的:打開失敗:EACCES(拒絕)

添加權限 即使在使用許可權的android:NAME =「android.permission .WRITE_EXTERNAL_STORAGE」

Android版本4.4.2

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my); 

    DocumentFile pickedDir = DocumentFile.fromFile(new File("/mnt/extSdCard/Test")); 

    // List all existing files inside picked directory 
    for (DocumentFile file : pickedDir.listFiles()) { 
     Log.d("Tag", "Found file " + file.getName() + " with size " + file.length()); 
    } 

    // Create a new file and write into it 
    DocumentFile newFile = pickedDir.createFile("text/plain", "My Novel"); 
    OutputStream out = null; 
    try { 

     //Says NullPointerException 
     out = getContentResolver().openOutputStream(newFile.getUri());        out.write("A long time ago...".getBytes()); 
     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    }   
} 

回答

5

新的API不僅有助於人們對棒棒堂寫入二次sdcar d,KitKat上的人仍然是out of luck

DocumentFile.fromFile(...)

這不會給你帶來任何額外的 訪問超出了您的應用程序已經有基礎文件。

要充分利用由Intent.ACTION_OPEN_DOCUMENT_TREE 創建新的權限,你必須使用返回的URI用DocumentFile.fromTreeUri

+0

我居然有此權限,但由於某些原因,調用DocumentFile.fromFile(背景下,文件).delete ();對我來說總會失敗。 – 2015-09-05 22:48:26

+0

據我所知,「不給你任何額外的訪問」仍然成立。如果您已經獲得完整存儲的URI訪問權限,並且希望獲得File - > DocumentFile,則必須根據您有權訪問的樹URI進行一些痛苦的URI構建,然後從中創建DocumentFile。查看DocumentFile源代碼,並查看FilePicker/Helper方法返回的URI中的差異等。 – darken 2015-09-05 23:37:53

+0

這是爲什麼?這個功能不是因爲這個而被認爲是無用的嗎?你的意思是告訴我,我需要遍歷文件樹? – 2015-09-06 05:13:57

相關問題