lollipop以降でSDカードへの書き込み許可

1,609 views
Skip to first unread message

高橋士郎

unread,
Feb 14, 2016, 4:42:21 AM2/14/16
to 日本Androidの会
いつもお世話になります。

現在、SDカード内外のファイル編集するアプリを開発しています。
lollipop以降の端末では、REQUEST_CODE_SECONDARY_STORAGE_ACCESS_PERMISSIONを使うことで
書き込みすることができることまではわかりましたが、
実装することができていません。

状況は以下のとおりです。

①単純にSDカード内にファイルを作成することはできる。
②取得した URI に恒久的にアクセスできるようにするための処理もできている(はず)
③(問題点)取得したURIの実際のパスが取得できない。
 例:②で取得したURI content://com.android.externalstorage.documents/tree/356B-5562%3A
   取得したいURI /storage/sdcard1/

③ができないことで、ファイル編集の際に
SDカード内のファイルであれば、現状でも編集可能ですが、
本体のファイルであると改めてパーミッションを要求する必要があるのではないかと考えています。

ご存じの方お願いします。

以下、ソース

public class Sd_manager extends Activity {

    public static final int REQUEST_CODE_SECONDARY_STORAGE_ACCESS_PERMISSION = 2;
    
private Button button01;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

   setContentView(R.layout.sd_manager);

   button01 = (Button) findViewById(R.id.button1);//編集モード
   
//
//編集モードリスナー
//
button01.setOnClickListener(new View.OnClickListener() {//イベントリスナーの設定「計算」
@Override
public void onClick(View view) {//viewの意味がわからない
// TODO 自動生成されたメソッド・スタブ
//
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
           startActivityForResult(intent, REQUEST_CODE_SECONDARY_STORAGE_ACCESS_PERMISSION);
       }
 
}
});
   }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (resultCode == RESULT_OK) {
            switch (requestCode) {
                case REQUEST_CODE_SECONDARY_STORAGE_ACCESS_PERMISSION:

                    // 取得した URI に恒久的にアクセスできるようにするための処理
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                        getContentResolver().takePersistableUriPermission(data.getData(),
                        Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                    }

                    Uri treeUri = data.getData();

                    //ここでtreeUriの実際のパスを取得したい
                    
                    DocumentFile pickedDir = DocumentFile.fromTreeUri(this, treeUri);
                    
                    
                    
                    // Create a new file and write into it
                    DocumentFile newFile = pickedDir.createFile("text", "My Novel");
                    OutputStream out;
                    try {
                    out = getContentResolver().openOutputStream(newFile.getUri());
                    out.write("A long time ago...".getBytes());
                    out.close();
                    } catch (FileNotFoundException e) {
                    // TODO 自動生成された catch ブロック
                    e.printStackTrace();
                    } catch (IOException e) {
                    // TODO 自動生成された catch ブロック
                    e.printStackTrace();
                    }
                    

                    break;
            }
        }
    }

team.hiroq

unread,
Feb 19, 2016, 10:44:44 AM2/19/16
to android-g...@googlegroups.com
高橋さん

こんばんは。
動作させて確認したわけではないので高橋さんの期待した動作になるかわかりませんが、
以下参考にしてみてはどうでしょう。

以前
content://com.android.externalstorage.documents/tree/356B-5562%3A
形式のURLから実際のURIを取得してうまくいきました。

うまくいくといいのですが。
では。

2016年2月14日 18:42 高橋士郎 <ffu...@gmail.com>:

--
このメールは Google グループのグループ「日本Androidの会」に登録しているユーザーに送られています。
このグループから退会し、グループからのメールの配信を停止するには android-group-j...@googlegroups.com にメールを送信してください。
このグループに投稿するには android-g...@googlegroups.com にメールを送信してください。
https://groups.google.com/group/android-group-japan からこのグループにアクセスしてください。
その他のオプションについては https://groups.google.com/d/optout にアクセスしてください。



--
-------------------------------------------
team-hiroq
twitter : team_hiroq
Reply all
Reply to author
Forward
0 new messages