エンジニア未満がエンジニア以上を目指す日々(仮)

戦力外通告の悔しさをバネに自身の技術力向上を目指した技術ブログ

データ保存(共有プリファレンス) - 壁紙変更アプリ (16)

Android のデータ保存は幾つか種類があるらしいです。
Storage Options | Android Developers

今回は共有プリファレンスを使ってみます。
この辺りを参考にしました。
Android Tips(16):プリファレンスを使用したデータの保存 - MONOist(モノイスト)
Android 奔走記: SharedPreferences を使ってみた

まずはランダム設定時にプリファレンスにパスを保存します。
# なんか画像が少ない時にランダム処理のあたりで
# 問題が発生することに気付きましたが、ひとまず保留

SubActivityRandom.java

public class SubActivityRandom extends ActionBarActivity{

    private static final String TAG = "WallpaperChange";
    public static final String PREFS_NAME = "RandomWallpaperChanger";
<省略>
    private SharedPreferences randomPath;
    private SharedPreferences.Editor editor;

    public void onCreate(Bundle savedInstanceState) {

<省略>

        /* Get SharedPreferences for save random path */
        randomPath = getSharedPreferences(PREFS_NAME, MODE_PRIVATE);

<省略>

        button.setOnClickListener(new View.OnClickListener() {

<省略>

                /* Save chosen path */
                editor = randomPath.edit();
                editor.putString("randomPath", curPath);
                editor.commit();

                finish();
            }
        });
    }
<省略>
}

次に、ACTION_SCREEN_OFF の intent を受け取った際に、
上記のプリファレンスからパスを取得します。

MainActivity.java

public class MainActivity extends ActionBarActivity implements OnClickListener{

    private static final String TAG = "WallpaperChange";
    public static final String PREFS_NAME = "RandomWallpaperChanger";
    WallpaperManager mWM;
    Bitmap bmpImageFile;

    private SharedPreferences rPath;

    private BroadcastReceiver screenStatusReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v(TAG, "Receive ACTION_SCREEN_OFF");
            String randomPath = rPath.getString("randomPath", "");
            Log.v(TAG, "Set path = " + randomPath);

        }
    };

<省略>

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

<省略>
        rPath = getSharedPreferences(PREFS_NAME, 0);

これで、ランダム表示した際のパスが保存され、
スクリーンオフの intent の際にパスを取得することができました。

10-12 12:11:32.697    2384-2384/com.example.wallpaperchanger.test01 V/WallpaperChange? Receive ACTION_SCREEN_OFF
10-12 12:11:32.697    2384-2384/com.example.wallpaperchanger.test01 V/WallpaperChange? Set path = /storage/sdcard0/DCIM/Camera

このプリファレンスっていつまで保存されるんだろう?
後で調べてみます。

次回はこのランダムパスを食わせて、
スクリーンオフをトリガーに画像のランダム設定を行います。

intent によるランダム画像表示機能 - 壁紙変更アプリ (15)

モチベーションが上がらないので細かい修正は後回しにします。

ランダム画像表示でやりたい事は、
スクリーンオフ -> オンで画像を自動的に変更すること。
そうなると intent の ACTION_SCREEN_OFF を拾って画像更新すれば良いのかな。

まずは AndroidManifest.xml に追加します。

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.intent.action.SCREEN_OFF" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>

次に Broadcast receiver を登録します。
参考にしたのは以下のサイトです。
Android DevTalk: スクリーンのON/OFFイベントを検出する

public class MainActivity extends ActionBarActivity implements OnClickListener{
<省略>
    private BroadcastReceiver screenStatusReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.v(TAG, "Receive ACTION_SCREEN_OFF");
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        registerReceiver(screenStatusReceiver, filter);
        setContentView(R.layout.activity_main);
<省略>

これでアプリを起動後に電源ボタンを押してスクリーンオフしてみます。

10-05 10:47:04.399  32597-32597/com.example.wallpaperchanger.test01 V/WallpaperChange? Receive ACTION_SCREEN_OFF

intent を受け取っていることを確認できました。
これを前回までに作成したランダム画像表示と組み合わせます。

前回は表示の都度ディレクトリを決定してランダムに画像選択していましたが、
今回はランダム画像選択部分のみを再度処理したいので、
事前にディレクトリを決めておく必要があります。
というわけで、選択したディレクトリ情報を保存しておきます。

...というところで今日は時間切れ。

おやすみ。

おやすみが増えてきてよくない傾向ですね。
明日か明後日に更新予定です。

それにしてもアップデートした Xperia Z (Android 4.4) の動作が重すぎる。
同じ機種を使ってる同僚に聞いたらとくに重くなっていないとの話だったので、
なにかが悪さをしてるんだろうなぁ。原因の調査をしてみます。