[Android TV] recommendation の背景background imageについて
土曜日, 1月 17th, 20152015/1/29 追記
背景画像のファイルサイズが大きいとタイムアウトして背景表示に失敗します。
recommendationを作成するときに、事前にダウンロードしてディスクキャッシュしました。ContentProvider では、キッシュをチェックして表示することで解決しました。
キャッシュにはDiskLruCacheを使用しました。
Android TV の recommendationで背景を表示する方法が、ほぼ情報無し状態です。
仕様変更があったようで、sdk付属のサンプルコードも背景取得できないありさま。
そんなわけで、ググったりしつつで解決したのでメモしておきます。
背景画像は、http:// で取得して表示する方法です。
https://plus.google.com/100427843958963974912/posts/D22DJZkKhDo
がとても参考になりました。Thanks!!
まず、ContentProvider を用意します。openFile()のみ必要であとは空っぽで大丈夫です。
url.openStream()を渡すところはこれで良いのか?と思ったけど、まあ動いてます 😀
public class RecommendationContentProvider extends ContentProvider { public static String AUTHORITY = "your unique authority here"; public static String CONTENT_URI = "content://" + AUTHORITY + "/"; @Override public ParcelFileDescriptor openFile(Uri uri, String mode) throws FileNotFoundException { ParcelFileDescriptor[] pipe = null; String path = uri.getPath(); try { String decodedUrl = URLDecoder.decode(path.replaceFirst("/", ""), HTTP.UTF_8); pipe = ParcelFileDescriptor.createPipe(); URL url = new URL(decodedUrl); new TransferThread(url.openStream(), new ParcelFileDescriptor.AutoCloseOutputStream(pipe[1])).start(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return pipe[0]; } static class TransferThread extends Thread { InputStream in; OutputStream out; public TransferThread(InputStream in, OutputStream out) { this.in = in; this.out = out; } @Override public void run() { byte[] buf = new byte[8192]; int len; try { while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } in.close(); out.flush(); out.close(); } catch (IOException e) { e.printStackTrace(); } } } @Override public boolean onCreate() { return true; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { return null; } @Override public String getType(Uri uri) { return "image/*"; } @Override public Uri insert(Uri uri, ContentValues values) { return null; } @Override public int delete(Uri uri, String selection, String[] selectionArgs) { return 0; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { return 0; } }
ContentProviderは、AndroidManifest.xml に記載する必要があります。
<application> ...snip... <provider android:name="packagename.RecommendationContentProvider" android:authorities="your unique authority here" android:exported="true"> </provider>
あとは、Notificationの作成だけです。
Bundle extras = new Bundle(); extras.putString( Notification.EXTRA_BACKGROUND_IMAGE_URI, RecommendationContentProvider.CONTENT_URI + URLEncoder.encode(data.getBgImageUrl(), HTTP.UTF_8)); Notification notification = new NotificationCompat.BigPictureStyle( new NotificationCompat.Builder(context) .setContentTitle(data.getTitle()) .setContentText(data.getBody()) ...snip... .setExtras(extras) ).build();
以上