カテゴリー ‘ スマートフォン

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情報通りの角度で表示されるようになります。

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

iPhoneでUILabelの高さ(height)を計算する方法


 

iPhoneでUILabelに表示させる文字量によって高さが変わる場合があると思います。

そんな時に動的に高さ(height)を知る方法をまとめました。

方法は2つ、

  1. 文字の内容UILabelのをして計算して高さを算出する方法
  2. UILabelに文字を設定してから、sizeToFitメソッドを呼び出して自動で高さを設定する方法

になります。

具体的にどうするのか見ていきましょう

1.文字の内容とUILabelのをして計算して高さを算出する方法

実際に計算する処理が以下になります。

    CGSize size = [label.text
                   sizeWithFont:label.font
                   constrainedToSize:CGSizeMake(width, 5000)
                   lineBreakMode:label.lineBreakMode];

sizeWithFont:constrainedToSize:lineBreakMode」を使用して計算します。

使用フォント、幅、改行モードを設定して自動計算してくれるメソッドが用意されてんるなんて便利ですね。

この時の注意点は、第2引数のSizeの高さをある程度大きな値を設定する事です。

そうすると、正しい値が戻ってくるので、正しい値で対象のUILabelの高さを設定します。

2.UILabelに文字を設定してから、sizeToFitメソッドを呼び出して自動で高さを設定する方法

次に自動的にUILabelの高さを決定してもらう方法です。

まず、ソースは

    [label setLineBreakMode:UILineBreakModeWordWrap];
    [label setNumberOfLines:0];
    CGRect frame = [label frame];
    frame.size = CGSizeMake(width, 5000);
    [label setFrame:frame];
    [label sizeToFit];

このメソッドでも、同じようにフォント、幅、改行モードを設定してから「sizeToFit」メソッドを呼ぶことで

自動的に高さが設定されます。

この時の注意点は、対象のUILabelの高さをある程度高い値で設定します。

もう一つ、「setNumberOfLines」には、「を設定しておいて下さい。

これを忘れると改行されなくなりますので注意してください。

 

このようにして計算出来た高さを使えば、対象のUILabelの正しい高さを設定できます。

return top