カテゴリー ‘ Android

AndroidのAsyncTaskは1度だけ(Cannot execute task)


AndroidのAsyncTaskのインスタンスを使いまわそうと思って、2回目の「execute」メソッドで

Cannot execute task: the task has already been executed (a task can be executed only once)

ってエラーがでて実行できませんでした。

AsyncTaskは1度しか実行できないようです。

使いまわさずに、必要な時に生成して、実行するようにしてくださいとのことでした。

 

AsyncTaskのドキュメントにも

「The task can be executed only once (an exception will be thrown if a second execution is attempted.)」

って書いてますし。。。

 

ちゃんちゃん。

AndroidのxmlでImageViewに「Missing contentDescription attribute on image」の警告


Androidのレイアウトをxmlで設定している時に、ImageViewに下記の警告が出てきた

Missing contentDescription attribute on image

原因を調べたら、Imageの説明をcontentDescriptionで記述しなさいよと言う事らしいなので

「android:contentDescription=”ここに画像の説明”」

この要素を追加したら警告が消えた。

 

最近のAndroidのSDKの変更点のキャッチアップが全然出来ていないので、ちょっとずつやっていこう

NFC(近距離無線通信)とは


NFC対応端末

NFCとは

近距離無線通信(きんきょりむせんつうしん)は、広義には到達距離の短い無線通信を指す。
ただし、日本では狭義に近接場型の無線通信(near field communication)を指す言葉・訳語として用いられることが普通である。通信エリアの特徴は、およそ1メートル〜数センチ程度の極短距離となる。「非接触通信」と同等である。FeliCa、ISO/IEC 14443(MIFARE)、ISO/IEC 18092などがある。

(Wikipediaから抜粋)

最近、Android端末にNFCのリーダー/ライターが搭載されるようになって、NFC熱が日本でも高くなってきました。

実は、日本に住んでいる人ならNFCに何かしら接触している事は多いと思います。

  • おサイフケータイ
  • Suica、PASMOなど
  • 社員証
知らず知らずに生活の中で使用されています。

日本で販売はされなかったですが、「Nexsu S」という端末が最初のNFCの搭載Android端末だったと思います。

Nexus S

私も、このNexsu Sを購入してNFCのアプリを試しに作成しまいた。

最初のころは、NFCのリーダー部分しかAPIが公開されていなく、書き込みを行おうと思うと一曲ありました。

でも、今では簡単に書き込みを行う事ができます。

対応機種(Android 2012/06/23時点wikipediaから)

  • Nexus S
  • GALAXY S II LTE SC-03D
  • GALAXY NEXUS SC-04D
  • GALAXY Note SC-05D
  • GALAXY S II WiMAX ISW11SC
  • Xperia S
  • Xperia ion
  • AQUOS PHONE SERIE ISW16SHF

Androidでは、上記のような機種がNFCを使用出来る代表的な機種になります。

ちょっと変わった所では、「BlackBerry Bold 9900」この機種もNFCに対応しています。(Docomoから販売)

NFCについて参考になるサイト

これらのサイトを読むことでNFCがなんなのかどういう事が出来るのかがわかると思います。

一度、時間のある時に読むのも面白いと思います。

Androidで懐中電灯アプリを作ってたら「 preview window is NULL! 」が出た話し


 

過去に作成した懐中電灯アプリがAndroid 4.0で動作しなくなった原因と解決策

(preview window is NULL!が出た時の対処方法)

Androidでカメラのライトを使用した懐中電灯アプリを作っていて、過去に動いてたアプリが動かなくなっていました。

その時、logcatに出力されていたエラーがこちら

出力されていたエラー:「preview window is NULL!」

原因:Cameraを起動する時にPreviewWindowの設定をしていない。

解決策:Android 4以上(たぶん)では、カメラデバイスのライトのみの使用でも「setPreviewWindow」で撮影した画像を表示するSurfaceViewを設定する必要がある。

と言う事で、SurfaceViewを追加してCameraにsetPreviewWindowで設定してみたら見事動作しました。

ということで、カメラのライトの動作を確認する為のサンプルアプリのソースコードです。

よければ使って見てください。

Androidでカメラで撮った写真の向きを自動で補正する方法


 

Androidで撮った写真をアプリで表示すると横に傾いて表示される場合があると思います。

そういう時に写真のExif情報を元に正しい向きに回転する方法です。

まず、以下のようにして正しい回転角度を取得します。

	private int getRotateDegree(String filePath)
	{
		int degree = 0;
		try {
			ExifInterface exifInterface = new ExifInterface(filePath);
			int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_UNDEFINED);
			if (orientation == ExifInterface.ORIENTATION_ROTATE_90) {
				degree = 90;
			} else if (orientation == ExifInterface.ORIENTATION_ROTATE_180) {
				degree = 180;
			} else if (orientation == ExifInterface.ORIENTATION_ROTATE_270) {
				degree = 270;
			}
			if (degree != 0) {
				exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION, "0");
				exifInterface.saveAttributes();
			}
		} catch (IOException e) {
			degree = -1;
			e.printStackTrace();
		}

		return degree;
	}

Exif情報から正しい角度が取得できたので、

取得した角度を写真に反映する

	public int rotateImage(String filePath)
	{
		filePath = filePath.replace("file://", "");
		int degree = getRotateDegreeFromExif(filePath);
		if (degree > 0) {
			OutputStream out = null;
			Bitmap bitmap = null;
			Bitmap rotatedImage = null;
			try {
				Matrix mat = new Matrix();
				mat.postRotate(degree);
				BitmapFactory.Options opts = new BitmapFactory.Options();
				opts.inJustDecodeBounds = true;
				BitmapFactory.decodeFile(filePath, opts);
				int width = 480;
				int scale = 1;
				if (opts.outWidth > width) {
					scale = opts.outWidth / width + 2;
				}
				opts.inJustDecodeBounds = false;
				opts.inSampleSize = scale;
				bitmap = BitmapFactory.decodeFile(filePath, opts);
				rotatedImage = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), mat, true);
				out = new FileOutputStream(filePath);
				rotatedImage.compress(Bitmap.CompressFormat.JPEG, 100, out);
			} catch (Exception ex) {
				ex.printStackTrace();
			} finally {
				if (out != null) try { out.close(); } catch (IOException e) {}
				if (bitmap != null) bitmap.recycle();
				if (rotatedImage != null) rotatedImage.recycle();
			}
		}
		return degree;
	}

これで、画像はExif情報通りの角度で表示されるようになります。

今回は保存しましたが、表示にのみ使用することも可能です。

return top