Archive for the 'Java' Category

[Android TV] recommendation の背景background imageについて

土曜日, 1月 17th, 2015

2015/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();

以上

Tomcat 5.0 で、フォームの文字化け(GETを利用時)

土曜日, 9月 6th, 2008

Tomcat5.0で、フォームが文字化けしたら、useBodyEncodingForURI=”true” をserver.xmlのに追加する。

EclipseのPluginめも

水曜日, 7月 16th, 2008

EclipseのPluginめも

Subversive
SVNとの連携。eclipse.orgのプロジェクト
 日本語による説明サイト