SDへのファイル操作

148 views
Skip to first unread message

ma2

unread,
Mar 16, 2017, 5:14:37 AM3/16/17
to 日本Androidの会
ma2@脳出血です。お世話になります。

以前、(No.29820)でアプリ以外のファイルの作成について質問しました。
以前は内部にファイルを作ろとしていました。
色々あり外部のmicroSDでの作成をするコードを作ることにしました。
が、またハマりましたorz
長い間、独りであれこれ考えていたので、判らなくなってしまいました。
皆さんで、見てもらえるとありがたいです。


関係している部分を以下に抜粋します。
1.
AndroidManifest.xml に追加
> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

2.
MainActivity.java(抜粋)
---
package com.example.ma2.weightscale;

public class MainActivity extends Activity implements OnClickListener {
    //! ファイル操作 ------------------------------------------------------------------------------
    static private final String FILE_NAME = "test.txt"; //"weightscale.csv";

    //!
    public boolean isExternalStorageWritable() {
        String state = Environment.getExternalStorageState();
        if( state.equals( Environment.MEDIA_MOUNTED ) ){
//        if( Environment.MEDIA_MOUNTED.equals( state ) ){
            Log.d( "ma2:", "isExternalStorageWritable: true" );
            return true;
        }
        return false;
    }

    //!
    public boolean isExternalStorageReadable() {
        String state = Environment.getExternalStorageState();
        if( Environment.MEDIA_MOUNTED.equals( state ) || Environment.MEDIA_MOUNTED_READ_ONLY.equals( state )) {
            return true;
        }
        return false;
    }

    protected void onDateFileWrite_Test01( String fileName ) {
        Log.d( "ma2:", "onDateFileWrite_Test01" );

        File file = new File( context.getExternalFilesDir( null ), fileName );
        Log.d( "ma2:", " -> File: " + file );

        if( isExternalStorageWritable() == true ){
            try {
//                boolean n;
//                n = file.getParentFile().mkdirs();
                if( !file.getParentFile().exists() && !file.getParentFile().mkdirs() ){
                    Log.d( "ma2:", " -> Unable to create " + file.getParentFile() );
                }
                else{
                    Log.d( "ma2:", " -> getParentFile(): " + file.getParentFile() );
                }
                FileWriter fw = new FileWriter( file );
//                Log.d( "ma2:", " -> n=" + n );
                Log.d( "ma2:", " -> " + file );
                Log.d( "ma2:", " -> " + "test" );

                fw.write( "test" );
//                fw.flush();
                fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    protected void onDateFileWrite_Test02( String fileName ) {
        Log.d( "ma2:", "onDateFileWrite_Test02" );

        File file = new File( context.getExternalFilesDir( null ), fileName );
        Log.d( "ma2:", " -> File: " + file );

        FileOutputStream fos = null;
        OutputStreamWriter osw = null;
        BufferedWriter bw = null;

        if( isExternalStorageWritable() == true ){
            try {
//                boolean n;
//                n = file.getParentFile().mkdirs();
                if( !file.getParentFile().exists() && !file.getParentFile().mkdirs() ){
                    Log.d( "ma2:", " -> Unable to create " + file.getParentFile() );
                }
                else{
                    Log.d( "ma2:", " -> getParentFile(): " + file.getParentFile() );
                }
//                Log.d( "ma2:", " -> n=" + n );
                fos = new FileOutputStream( file );
                osw = new OutputStreamWriter( fos, "UTF-8" );
                bw = new BufferedWriter( osw );

                Log.d( "ma2:", " -> " + file );
                Log.d( "ma2:", " -> " + "test" );

                bw.write( "test" );
//                bw.flush();
                bw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3.
現状、onDateFileWrite_Test01、onDateFileWrite_Test02どちらでもファイルは作られません。
getExternalFilesDirをEnvironment.DIRECTORY_PICTURESなどにするとフォルダは作られます。

以上。よろしくお願いします。

Hirokazu Fukami

unread,
Mar 16, 2017, 8:00:34 AM3/16/17
to 日本Androidの会

こんにちはfkmです。

getExternalFilesDir()で返されるフォルダは実際には存在しないことがあるので
mkdirs()を呼んで作る必要があります

公式ドキュメントのサンプルをどうぞ
https://developer.android.com/training/basics/data-storage/files.html?hl=ja#WriteExternalStorage


2017年3月16日(木) 18:14 ma2 <gpmfa...@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 にアクセスしてください。

ma2

unread,
Mar 17, 2017, 6:32:28 AM3/17/17
to 日本Androidの会
fkmさん、返信ありがとうございます。
ma2です。
file.mkdirs() ですが。使っています。
また、context.getExternalFilesDir の返り値のログを出しているのですが存在しないディレクトリにはなっていません。
onDateFileWrite_Test01,02のログを以下にまとめました。
ここおかしいよ? というところがありましたら教えてください。よろしくお願いします。

onDateFileWrite_Test01 のロク。
D/ma2:: onDateFileWrite_Test01
D/ma2:: -> File: /storage/emulated/0/Android/data/com.example.ma2.weightscale/files/test.txt
D/ma2:: isExternalStorageWritable: true
D/ma2:: -> getParentFile(): /storage/emulated/0/Android/data/com.example.ma2.weightscale/files
D/ma2:: -> /storage/emulated/0/Android/data/com.example.ma2.weightscale/files/test.txt
D/ma2:: -> test

続いて onDateFileWrite_Test02 のロク。
D/ma2:: onDateFileWrite_Test02
D/ma2:: -> File: /storage/emulated/0/Android/data/com.example.ma2.weightscale/files/123.txt
D/ma2:: isExternalStorageWritable: true
D/ma2:: -> getParentFile(): /storage/emulated/0/Android/data/com.example.ma2.weightscale/files
D/ma2:: -> /storage/emulated/0/Android/data/com.example.ma2.weightscale/files/123.txt
D/ma2:: -> test

Hiroaki GOTO as GORRY

unread,
Mar 17, 2017, 10:00:29 AM3/17/17
to android-g...@googlegroups.com

後藤 浩昭(GORRY)です。

そもそもですが、Environment.getExternalFilesDir()で
得られるディレクトリが「どの物理ストレージの上にあるか」は
環境により異なります。
microSDカードでなく、「本体内部の[外部]ストレージ」で
ある機種・OSバージョンも珍しくありません。

アプリからmicroSDカードをアクセスしたいなら、
「Storage Access Framework(SAF)でユーザーにmicroSDを
指定してもらう」のが確実な方法となります。
(この方法であれば、microSDカードだけでなく、USBストレージや
クラウド上のストレージなども同じ手順でアクセス対象にできます)

Storage Access Framework(SAF)の説明は以下に。
https://developer.android.com/guide/topics/providers/document-provider.html?hl=ja




In message <d34fdaf6-15ae-4264...@googlegroups.com>
"Re: [android-group-japan: 29881] SDへのファイル操作"
> --
> このメールは 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 にアクセスしてください。



--
Hiroaki GOTO as "GORRY" : 後藤 浩昭
EMAIL: gorr...@gmail.com

ma2

unread,
Mar 20, 2017, 11:29:58 AM3/20/17
to 日本Androidの会
ma2です。
SDカード内ではなく、内部ストレージにファイルが作られているのを確認しました。

また、SAFのページですが、Android 4.4(APIレベル19)と言うところから、むむっとなってしまいましたorz
自分の手元にある実機が4.0と5.0の物なので、できることなら、4.0からサポートしてくれたらいいのに、と思ってしまいました。
せっかく返信をいただいたのと思い、現状だけですが報告をします。

Reply all
Reply to author
Forward
0 new messages