昨日に引き続きデータ保存
SDカードへのファイル保存
パーミッションの付与
SDカードを利用する際には、パーミッションの記述が必要です。
AndroidManifest.xmlを開き、
許可タブ > 追加 > Uses Permisson > Nameのドロップダウンリストから「android.permission.WRITE_EXTERNAL_STORAGE」を選択
xmlファイルを見ると下記1行が追加されていることが確認できる。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import 色々; public class MainActivity extends Activity { EditText et; Button btnIn; Button btnOut; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); addEvent(); } private void findView() { et = (EditText) findViewById(R.id.editText1); btnIn = (Button) findViewById(R.id.button1); btnOut = (Button) findViewById(R.id.button2); } private void addEvent() { btnIn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { String fullPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/myfile.txt"; // 絶対パスの取得とファイル名の設定 File file = new File(fullPath); // Fileオブジェクトの生成 FileInputStream fis = new FileInputStream(file); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader br = new BufferedReader(isr); String lineStr; StringBuilder sb = new StringBuilder(); while ((lineStr = br.readLine()) != null) { sb.append(lineStr); } br.close(); et.setText(sb.toString()); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }); btnOut.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { String fullPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/myfile.txt"; File file = new File(fullPath); FileOutputStream fos = new FileOutputStream(file); OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8"); PrintWriter pw = new PrintWriter(osw); String str = et.getText().toString(); pw.append(str); pw.close(); } catch (IOException e) { e.printStackTrace(); } } }); } } |
実行結果
/mnt/sdcard内にファイルが保存されている。DDMSで確認。
ライブ壁紙
ホーム画面に設定できるアプリケーションのこと。
ライブ壁紙専用のWallpaperServiceクラスを使う。
ライブ壁紙一覧に表示させる
リスト表示用のファイルの作成
res/xml/ファイル名.xmlを作成(xmlフォルダは作成すること)
wallpaperタグを記述する。
1 2 3 4 |
<?xml version="1.0" encoding="utf-8"?> <wallpaper xmlns:android="http://schemas.android.com/apk/res/android" android:description="表示させたい説明文" android:thumbnail="表示させたい画像" /> |
descriptionが説明文、thumbnailがサムネイル。それぞれ指定したものがライブ壁紙のリストに表示される。
マニフェストファイルを修正する
ライブ壁紙の登録を行うために、AndroidManifest.xmlを書き換え。
Activityを利用しないため、Activityの記述を削除して、代わりにserviceタグを追加する。
16 17 18 19 20 21 22 23 24 25 26 |
<service android:name=".MyLiveWallpaper" android:label="アプリの名前" android:permission="android.permission.BIND_WALLPAPER"> <intent-filter> <action android:name="android.service.wallpaper.WallpaperService" /> </intent-filter> <meta-data android:name="android.service.wallpaper" android:resource="@xml/meta_data" /> </service> |
permissionで壁紙のバインドを許可している。
intent-filterにライブ壁紙であることをOSに示すための記述、
meta-dataにリスト表示用のファイルを指定する記述。
ライブ壁紙のコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import 色々; public class MyLiveWallpaper extends WallpaperService { @Override public Engine onCreateEngine() { return new MyLiveWallpaperEngine(); } class MyLiveWallpaperEngine extends Engine implements Runnable { boolean isLoop = true; // 生成時の処理 @Override public void onSurfaceCreated(SurfaceHolder holder) { super.onSurfaceCreated(holder); // 処理 Thread thread = new Thread(this); thread.start(); } // 破棄時の処理 @Override public void onSurfaceDestroyed(SurfaceHolder holder) { super.onSurfaceDestroyed(holder); // 処理 isLoop = false; } // タッチイベント発生時の処理 @Override public void onTouchEvent(MotionEvent event) { super.onTouchEvent(event); // 処理 } // 別スレッドでの描画処理 @Override public void run() { while (isLoop) { Canvas canvas = getSurfaceHolder().lockCanvas(); if (canvas != null) { // 処理 } getSurfaceHolder().unlockCanvasAndPost(canvas); } } } } } |
WallpaperServiceはonCreateEngine()メソッドを実装しなければならない。
Engineは内部クラスとして定義している。
EngineはSurfaceViewを継承しているため、SurfaceViewと同等のメソッドが定義されている。
コメント
No Trackbacks.