Android の中でなかなかテキストファイルに書き込む機会も無いので、FileOutputStream と SharedPreferences でカメラで撮った画像を外部ストレージに書き込むのに知っておきたい情報の確認をしています。 ボタンのイベント 一般的に3種類あるボタンのイベントの作成方法で、ボタンの id によって処理を分けていく結果になる使い方です。ソースとしては自然と連続になるので、このような場合( Write と Read ) では第三者から見たら解りやすくなると思います。(MainActivity に implements View.OnClickListener が必要ですね) ※ 他の二つは、無名(匿名)のインナーでその場に書いてしまう方法と、ボタンのプロパティにメソッド名登録して、MainActivity の メソッドとしてイベントする方法です。 書き込み処理では、BufferedWriter はほぼ無駄なので使っていません。最後に改行コードつけておけば、BufferedReader で読めますし。 書き込んだ後は、Android Device Monitor で push してリアルに確認するのがいいですね。Android に騙されないで、なんか安心します。 test.txt ※ test.txt は、files フォルダのの下にあります
ストレージ情報 /storage/emulated/0 android.permission.CAMERA android.permission.WRITE_EXTERNAL_STORAGE 0
Environment.getExternalStorageDirectory().getPath() で /storage/emulated/0 が取得できています。ここに書き込みするためには Android 6.0 では Runtime Permission の処理が必要になってくるわけですが、今は場所のみを Android Device Monitor で確認しておきます。
package com.example.lightbox.textfiletest; import android.Manifest; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.text.SimpleDateFormat; import java.util.Calendar; public class MainActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.i("lightbox", "implements View.OnClickListener したら、setOnClickListener(this)"); findViewById(R.id.button).setOnClickListener(this); findViewById(R.id.buttonRead).setOnClickListener(this); } @Override public void onClick(View v) { // View から ID を取得して仕分け if (v.getId() == R.id.button ) { Log.i("lightbox", "AndroidManifest.xml に権限の記述の必要無いプライベートな書き込み"); try { FileOutputStream fileOutputStream = openFileOutput("test.txt", MODE_PRIVATE); OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "utf-8"); // 次の段階のストレージアクセスの為の情報集め outputStreamWriter.write("ストレージ情報\n"); outputStreamWriter.write(String.format("%s\n", Environment.getExternalStorageDirectory().getPath())); // String outputStreamWriter.write(Manifest.permission.CAMERA + "\n"); outputStreamWriter.write(Manifest.permission.WRITE_EXTERNAL_STORAGE + "\n"); // int outputStreamWriter.write(PackageManager.PERMISSION_GRANTED + "\n"); outputStreamWriter.close(); fileOutputStream.close(); // プライベートな小さな情報を保存する為の本来の方法 SharedPreferences data = getSharedPreferences("private_data", MODE_PRIVATE); SharedPreferences.Editor editor = data.edit(); // 現在の年月日・時分秒を取得する為の準備 Calendar cal = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd_HHmmss"); editor.putString("now", sf.format(cal.getTime())); editor.commit(); } catch (Exception e) { e.printStackTrace(); } } else if ( v.getId() == R.id.buttonRead ) { Log.i("lightbox", "読み込み"); try { FileInputStream fileINputStream = openFileInput("test.txt"); InputStreamReader inputStreamReader = new InputStreamReader(fileINputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String line_buffer; while( null != (line_buffer = bufferedReader.readLine()) ) { // 長さ 0 で Empty if (line_buffer.isEmpty()) { continue; } Log.i("lightbox",line_buffer); } inputStreamReader.close(); fileINputStream.close(); SharedPreferences data = getSharedPreferences("private_data", MODE_PRIVATE); Log.i("lightbox", data.getString("now", "このデータはありません")); } catch (Exception e) { e.printStackTrace(); } } } }
Manifest.permission.CAMERA や Manifest.permission.WRITE_EXTERNAL_STORAGE は、Runtime Permission のチェックで使う定数です。これを ActivityCompat.checkSelfPermission に渡して利用可能の有無をまずチェックします。(実際は継承元の ContextCompat のメソッド)
|
【2017 Android Studioの最新記事】
- 別に納品するわけでは無いので、Android の ListView のカスタマイズなんてこれで十分でしょ / TestArrayAdapter バージョン2
- Java : Class 構造より、update 文を作成する
- ViewSwitcher を使用した2画面アプリ (5) : SQLiteデータを更新する
- ViewSwitcher を使用した2画面アプリ (4) : SQLiteデータをインポートしてリストビューに表示する
- Android Studio にインポートして使用する SQLite データベースを MDB より作成する VBScript
- ViewSwitcher を使用した2画面アプリ (3) : 画面部分の作成と画面切り替えテスト『画面をコントロールする Helper クラスの作成』
- ViewSwitcher を使用した2画面アプリ (2) : 画面部分の作成と画面切り替えテスト『画面の作成』
- ViewSwitcher を使用した2画面アプリ (1) : 画面部分の作成と画面切り替えテスト『メニューの作成』
- OkHttp を使用した HttpAccess クラスで Web 上の 画像をダウンロードして表示するテンプレート
- OkHttp を使用した HttpAccess クラスで Web 上の PHP アプリに対してファイルをアップロードするテンプレート
- OkHttp を使用した HttpAccess クラスで Web 上の掲示板に投稿(POST)するテンプレート
- OkHttp を使用した HttpAccess クラスで Web 上のデータを取得(GET)して ListView を表示するテンプレート
- Okhttp を使用した、GET、POST、ファイルアップロードを楽に実装できる HttpAccess クラス
- Android の assets フォルダーに保存した 400x320 の画像ファイルの扱い
- Android の drawable フォルダーに保存した 400x320 の画像ファイルの6種類の扱いと Density
- Android での保存用テキストデータの扱いを okio で簡素化する
- Android 6.0 : テストの為の Runtime Permission の対応を自動化するテンプレート
- Android Studio : Runtime Permission 等の裏方作業を MainActivity にさせて、本来の処理は継承したサブクラスで行う( カメラを呼び出して画像を保存させ、I..
- Android 6.0 エミュレータで 複数の Runtime Permission の対応を簡潔に吸収するクラス( CheckMyPermission )
- Android Studio : エミュレータで Notification(通知)のテスト