2021年2月14日日曜日

パーミッション設定せずに外部ストレージ保存する方法

Androidスマホでデータを取って、PCと接続して抜き出す。
これを繰り返すような作業をするとき、端末内にファイル書き込みする手が有力だ。

その際に直面するのが、どこにファイル保存するか。
内部ストレージになら簡単に保存できるが、PCへファイルの抜き出しが面倒...
逆に外部ストレージに保存するなら、Androidのシステム上、Manifestへパーミッション設定、動的にラインタイムパーミッションの実装が必要で面倒...しかも外部ストレージアクセス法がOSバージョンによって異なるのも厄介。

なので、今回は
パーミッション設定せずに外部ストレージ保存する方法を書き残しておく。


アプリ固有ストレージ領域

アプリ固有のストレージ領域はパーミッションが不要になる。つまり、固有領域の外部ストレージに保存すれば良い。比較の為、内部ストレージ側についても記述する。

内部ストレージ

内部ストレージは全てがアプリ固有領域。
getFilesDiropenFileOutputで参照でパスを取得できる。
保存先の絶対パス ※二つあるけど、参照しているディレクトリは同じ場所を指している
① /data/user/0/{アプリのパッケージ名}/files
② /data/data/{アプリのパッケージ名}/files

外部ストレージ

本題。外部ストレージは場所が決まっている。
getExternalFilesDirで参照パスが取得できる。
保存先の絶対パスはここ
/storage/emulated/0/Android/data/{アプリのパッケージ名}/files
PCでつないで確認する際はこのパス※Win10でGalaxNote10+(Android11)接続の場合
PC\Galaxy Note10+\Phone\Android\data\{アプリのパッケージ名}\files
どの端末でも「data\パーッケージ名\files」配下に格納されるので、SDカード側ではなくスマホのストレージを見て、「Android」か「data」というファイル名を探せば見つかるはず。 

実装例

ただファイルを作るだけの実装例
public class MainActivity extends AppCompatActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String fileName = "Sample.txt";
        File path;

        // 内部ストレージ保存ならこっち
        path = new File(getFilesDir(), fileName);

        // 外部ストレージ保存ならこっち
        path = new File(getExternalFilesDir(null), fileName);

        // ファイルを作る
        try {
            boolean b = path.createNewFile();
        } catch (IOException ignored) {
        }
    }

}


アクセス確認の注意点

公式ページによれば、外部ストレージのアクセス確認をしてから保存処理する必要があるので実施したほうがよいが、今回は自分用の単純にログファイル抜粋機能なので確認しない実装としている。
もしファイルが作成されなくなったら確認しよう。の備忘録でこの記述は残しておく。


PC接続したままファイル作成するときの注意点

スマホをPCに接続した状態で、ファイル作成を行っても、PC上でファイルが追加されていないように見えることがある。
しかしADBで確認すると作成できている...

PC側のエクスプローラでフォルダ移動やF5で読み込みをしてもダメ。
私のスマホだけなのか?
再マウントが必要みたいで、
いったんPCとスマホを切断してもう一度接続しましょう。

0 件のコメント:

コメントを投稿