上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[Android] String#isEmpty() でコンパイルエラーとなる

文字列が空文字か判定しようとして、String#isEmpty() を呼び出してみたのですが、
下記のようなエラーが出てしまった。。。

Call requires API level 9 (current min is 7): java.lang.String#isEmpty


APIレベル7をサポートしようとすると、String#isEmpty() は使えないのかな・・・


そこで、Javaの isEmpty() を確認すると、
「length() が 0 の場合は true、そうでない場合は false」
とのこと。

これなら、簡単に実装できると思ったのですが、
Androidにはどうやら TextUtils.isEmpty(string) というのが
サポートされているようだ。

TextUtils.isEmpty(string) は文字列(string)がNULLもしくは
length() が 0 の場合は true を返してくれるので、
String#isEmpty() より、ちょっと高機能。

これで、問題は解決できました。

Windows便利ツールの「拡大鏡」

Windowsのアクセサリって、

・メモ帳
・ペイント
・電卓
・コマンドプロンプト

など、メジャーなアプリケーションがありますが、
今回は「拡大鏡」なるものを紹介。

拡大鏡1



名前の通り、拡大表示してくれるアプリケーションで、
マウスポインタ付近を拡大して表示してくれる。

拡大鏡2

老眼の人に役立つか。
それとも、プロジェクタなどでプレゼンする際に役立つか。

用途はいろいろありそうですな。


ただ、解像度の低い画面上では拡大してみるのは辛いとこ。



ちなみにどうでもいいことだが、拡大表示しているウインドウは
プリントスクリーンで画面コピーした際にキャプチャの対象になっていないようですな。






[Android] android-support-v4 には PreferenceFragment が入っていない

設定画面などを簡単に作成する機能として、PreferenceActivity、PreferenceFragmentがあり、

Android3.0より前:PreferenceActivity を使用
Android3.0以降 :PreferenceFragment を使用

のような説明がよくみられるが、Android2.X系でのFragmentをサポートする android-support-v4ライブラリ にPreferenceFragmentは入っていないようだ。

【参考】
http://developer.android.com/reference/android/support/v4/app/package-summary.html


ということは、Android2.X系の端末もサポートする場合 PreferenceActivity を使用したほうが無難である。

ちなみに、PreferenceActivity.addPreferencesFromResource () は、「API level 11」から deprecate であるようだが、 supportライブラリに入ってないということは、当分は問題なく使えるのではないだろうか??




[Android] カメラピュレビューからの画像保存

コメントをいただきましたので、
-----------------------------
カメラプレビュー
 ↓
ボタン押下
 ↓
画像保存
 ↓
ギャラリー表示
-----------------------------

というのを試してみました。


まずは、お試しコード。
不十分な個所が多いので、改善が必要かな・・・
public class SampleActivity extends Activity {

Activity mActivity;
Camera mCamera; // カメラインスタンス

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mActivity = this;

FrameLayout frameLayout = new FrameLayout(this);

Button btn = new Button(this);
btn.setText("ボタン");
btn.setOnClickListener(new OnClickButton());

SurfaceView sv = new SurfaceView(this);
SurfaceHolder sh = sv.getHolder();
sh.addCallback(new SurfaceHolderCbk());
sh.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT, FrameLayout.LayoutParams.WRAP_CONTENT);

frameLayout.addView(sv);
frameLayout.addView(btn, layoutParams);

setContentView(frameLayout);
}

public class SurfaceHolderCbk implements SurfaceHolder.Callback {

/**
* サーフェイスが変更された時のコールバック。
*/
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// カメラプレビューを開始
mCamera.startPreview();
}

/**
* サーフェイスが生成された時のコールバック
*/
@Override
public void surfaceCreated(SurfaceHolder holder) {
// カメラオープン
mCamera = Camera.open();
try {
// プレビューを表示するサーフェイスホルダーを設定
mCamera.setPreviewDisplay(holder);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* サーフェイスが破棄された時のコールバック
*/
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// カメラプレビューを停止
mCamera.stopPreview();
mCamera.release();
mCamera = null;
}
}

private PreviewCallback previewCallback = new PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// プレビューコールバックを解除
mCamera.setPreviewCallback(null);

// カメラのデータフォーマットを取得する
int format = mCamera.getParameters().getPreviewFormat();
YuvImage yuvimage = new YuvImage(
data,
format,
mCamera.getParameters().getPreviewSize().width,
mCamera.getParameters().getPreviewSize().height,
null);

Rect rect = new Rect(0, 0, mCamera.getParameters().getPreviewSize().width, mCamera.getParameters().getPreviewSize().height);

// JPEGに変換してファイル保存
try {
File file = new File(Environment.getExternalStorageDirectory().getPath() + "/sample.jpg");
FileOutputStream out = new FileOutputStream(file, true);
yuvimage.compressToJpeg(rect, 50, out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}

// ギャラリーに反映
sendBroadcast(
new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse( "file://" + Environment.getExternalStorageDirectory() )
)
);
}
};

public class OnClickButton implements OnClickListener {

@Override
public void onClick(View v) {
// プレビューコールバックを設定
mCamera.setPreviewCallback(previewCallback);
}

}

}


カメラプレビューを表示する部分に関しては、
[Android] カメラプレビューを表示してみる
を参考に。

画像の保存は、PreviewCallback#onPreviewFrame() で行った。
Cameraインスタンスにコールバックをセットすると呼び出されるようになる。

プレビューイメージはbyte配列で、YuvImageという形式なので、
Jpegなどに変換してあげるのが一般的なのかな。

YuvImage については Developpers サイトを参考に。
http://developer.android.com/intl/ja/reference/android/graphics/YuvImage.html

YuvImage#compressToJpeg() を使用することで簡単に変換できます。


今回は、SDカードへ保存しました。
ちなみに、SDカード保存時は以下のパーミッションを忘れずに。
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

ギャラリーの追加は画像ファイル保存しておけばAndroid側で自動的に、
拾ってギャラリーに登録してくれるかと思ってましたが、勘違いだったようです。。。

そこで、ギャラリーに反映させるために、ブロードキャストで ACTION_MEDIA_MOUNTED を通知した。
SDカードがスキャンされ、ギャラリーに追加されました。


動作的には、ちゃんと画像保存されてギャラリーにも出てきたが、
改良は必要だろうな。。。



[Android] アプリリーリース (簡単体重レコード)

簡単体重レコード アプリアイコン
簡単体重レコード
(無料)

Androidアプリを Google play に公開しました。

今回は、体重を記録するアプリ。

手軽にデータ登録ができるように、ウィジェットからの
登録機能を実装しました。


■トップ画面
トップページ


■ウィジェット
ウィジェット


■グラフ表示
グラフ



プロフィール

hiiro

Author:hiiro

最新記事
カテゴリ
月別アーカイブ
最新コメント
最新トラックバック
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
Counter
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。