Web Camera 画像比較プッシュ通知(GCM版)システムの構築を 合わせたものをやってみました。

画像を比較して、差分が大きければプッシュ通知で告知し、画像を見てみます。



プッシュ通知は送れる情報量が4KB程度なので、画像なんかは別口で送る必要があります。

Web上に置かれた画像をImageViewに表示して、ついでにキャッシュしておきます。

ここでの眼目は、2つのシステムをつなぐ中間の仕組みです。

要件は

1:プッシュ通知で送られた情報を元に画像を引っ張ってきて表示する部分
2:アプリを再起動しても最新の画像を表示する部分

の2点です。






1:プッシュ通知で送られた情報を元に画像を引っ張ってきて表示する部分

UrlImageView というライブラリを使ってみます。

MITライセンスなので、自由がききます。

画像はキャッシュしてくれるのですが、そこが今回は少々障害になる部分でもあります。

画像が更新される場合は名前を変えておかないと、キャッシュが使われImageViewの表示も更新されません。

ライブラリは5つのクラスで構成されていて、AndroidManifest.xmlもlayoutもシンプルです。

普通に使う分には、修正は不要です。

上記で記述されているMainActivityを見れば、使い方も一目瞭然です。

こんな感じ。

以下のxxxxxxの部分はご自分のパッケージ名で置き換えてください。

【MainActivity.java】

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

import xxxxxx.ImageCache;
import xxxxxx.R;
import xxxxxx.UrlImageView;
import xxxxxx.UrlImageView.OnImageLoadListener;


public class MainActivity extends Activity {

    private UrlImageView mImageView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mImageView = (UrlImageView)findViewById(R.id.imageView);
        mImageView.setImageUrl("http://k.yimg.jp/images/top/sp/logo.gif", imageLoadListener);
    }

    @Override
    public void onDestroy() {
        ImageCache.deleteAll(getCacheDir());
        super.onDestroy();
    }

    final private OnImageLoadListener imageLoadListener = new OnImageLoadListener() {
        @Override
        public void onStart(String url) {
            //Toast.makeText(getApplicationContext(), "start", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onComplete(String url) {
            //Toast.makeText(getApplicationContext(), "end", Toast.LENGTH_SHORT).show();
        }
    };
}


【AndroidManifest.xml】

<uses-permission android:name="android.permission.INTERNET"/>


【activity_main.xml】

以下のxxxxxxの部分はご自分のパッケージ名で置き換えてください。

<xxxxxx.UrlImageView
    	android:id="@+id/imageView"
    	android:layout_width="fill_parent" 
    	android:layout_height="fill_parent"
/>





2:アプリを再起動しても最新の画像を表示する部分

Web Camera 画像比較 で画像を保存する場合は、画像名にタイムスタンプを使うなどしてユニークにしておきます。

プッシュ通知を発行する際には、この画像名を配信するようにします。

プッシュ通知(GCM版)システムの構築 のGCMIntentServiceクラスのonMessageで通知される情報でファイル名を取得するようにします。

画像名をプリファレンスに保存するようにすれば、アプリの起動時に読み込みで、最新の画像が表示されます。

(画像名が新しくなっていないと、キャッシュから以前の画像が読まれてしまいます)






こんな感じ。

通知の着信から画像読み込みのための少々のタイムラグがあった後、表示されます。