Android4.4以降では、Storage Access Frameworkを利用することで、

Windowsで言うところのエクスプローラーのような画面が立ち上がり、

好きなフォルダに移動してファイルを読み込んだり、書き込んだりする事ができます。

 

今回の記事では、SAFを利用して、ユーザーが任意のディレクトリを指定してファイルを書き込む処理について解説します。

今回解説する画面フロー

以下のように、CSVファイル出力の「出力」ボタンをタップして・・・
SAFが開いてユーザーに任意のディレクトリを選択してもらい、「保存」ボタンをタップされたら・・・
SAFから引き継いだディレクトリ情報をダイアログに表示します。

実装コード


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // CSV出力ボタン処理
        Button csvOutputBtn = (Button) findViewById(R.id.csvOutputButton);
        csvOutputBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                confirmSelectFolder();
            }
        });
    }
    private void confirmSelectFolder() {
        String fileName = "PasswordListFile_" + getNowDateString() + ".csv";

        Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("text/csv");
        intent.putExtra(Intent.EXTRA_TITLE, fileName);

        startActivityForResult(intent, OUTPUT_CSV);
    }

    private String getNowDateString(){
        Date date = new Date();
        final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
        return sdf.format(date);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
        super.onActivityResult(requestCode, resultCode,resultData );

        if (requestCode == OUTPUT_CSV && resultCode == Activity.RESULT_OK) {
            if(resultData.getData() != null){

                Uri uri = resultData.getData();

                OutputExternalFile externalFile = new OutputExternalFile(this);
                externalFile.outputSelectFolder(uri);
            }
        }
    }

おさえるポイント

SAFを利用するためには、Intent.ACTION_CREATE_DOCUMENTを指定してIntentをStartさせるだけです。
そして、ユーザーが指定したディレクトリは、resultData.getData()でUriが取得できてしまいます!
 
以下のアプリで実際の動作を確認できるのでぜひ試して見てください。