2012年1月29日日曜日

Notification

1.NotificationManager を取得する
 
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
2.Notificationオブジェクト生成
 
Notification notification = new Notification(
android.R.drawable.btn_default,
"通知情報が届きました",
System.currentTimeMillis());

・Notificationクラス
→通知情報のコンテキスト
 サウンド、バイブレーション、LEDを用いてアラートする事も
 引数1 icon 一覧に表示するアイコンID
 引数2 text 表示するテキスト
 引数3 表示する時間

3, PendingIntentを用意
 
Intent intent = new Intent(Intent.ACTION_VIEW);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, intent, 0);
・PendingIntent
Intentを、タイミングを指定して発行することができるIntent。
時間を指定したり、イベント発生時に発行する。

4.通知情報の設定
 
notification.setLatestEventInfo(
getApplicationContext(),
"アプリ名",
"通知情報の説明文",
contentIntent);

5.一旦、Notificationを削除
 
nm.cancel(id)
6.Manager経由でNotify発行
 
nm.notify(R.string.app_name, notification);

Failed to install ----.apk on device

USBデバッグでデバイスを繋いだ状態で、apkをインストール出来なかった
症状が発生したのでメモ。

ググったところMP3をパッケージに含めたために
発生した転送のタイムアウトエラーでした。

「ウィンドウ」→「設定」→「Android」→「DDMS」→「ADB 接続タイム・アウト」
の時間を変更することで、問題解決。

2011年12月27日火曜日

謎のエラーで実行できない(2)


またしても、プロジェクトをビルドしても実行できなくなった。
ちょいとManifest.xmlをいじっていたり、使ってないプロジェクトを閉じたり
していただけなんだけど・・以下のエラーが出る。

> Error generating final archive: Debug certificate expired on ...

解決手順:

1.プロジェクト→クリーンを行う

↓それでも治らない

2.デバッグのキーストアとかゆう情報の期限切れらしい
JDKに付属する keytool というもので、キーストアを再度生成して置き換える
ことで問題は解決した。

●手順 A.キーストアの場所を確認
 →eclipseの「ウィンドウ」「設定」「Android」「ビルド」「Default debug keystore」から
パスを確認

自宅環境では以下の場所だった。
> C:\Documents and Settings\PCのユーザー名\.android\debug.keystore

●手順 B. keytool.exeを用いて、以下のコマンドでキーストアを生成する
keytoolがない場合はJDKをインストールする。
keytoolのパスが通っていない場合は、環境変数にパスを通して置く
自宅環境では以下の場所だった。
> C:\Program Files\Java\jdk1.6.0_23\bin

コマンドプロンプトで以下を実行

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US"

パスワードを要求されるので android と入力する

●手順 C.ファイルの置き換え
C:\Documents and Settings\PCのユーザ名\.android

に debug.keystore というファイルが出来ていたので
それを、Aのファイルに置き換える。

●手順 D.
実機を繋いでいる場合は、一度apkをアンインストールしてから
もう一度、プロジェクトをCleanして実行する


参考サイト
http://magpad.jugem.jp/?eid=151
http://magpad.jugem.jp/?eid=77

2011年12月19日月曜日

ステータスバーに進捗を表示する


1.OnCreate()と、SetContentView()の間にプログレスバーの許可を書く

// プログレスバー許可
requestWindowFeature(Window.FEATURE_PROGRESS);


2. SetContentView()後に、まずはプログレスバーをOFFにしておく

// プログレスバー表示の設定
setProgressBarVisibility(false);

3.以下のメソッドで、プログレスバーを操作

引数は、 0 - 10000 の範囲で進捗を通知する。
10000になるとプログレスバーが消える

setProgress();

以上!

2011年12月18日日曜日

オプションメニューの作り方


使い方は、Activityのメソッドをオーバーライドする方式なので簡単。

○説明
menu.addメソッドでメニューを追加する。
・2番目の引数のMENU_ID01にメニューIDを指定する。Menu.FIRSTから順番に指定していけばOK
・4番目の引数に、メニュー名を指定する 
 
@Override
// オプションメニュー生成時のイベント
public boolean onCreateOptionsMenu(Menu menu)
{
 // オプションメニューを生成、追加する
 MenuItem item = menu.add(Menu.NONE, MENU_ID01, Menu.NONE, "SampleMenu");
 // アイコンを設定する
 // android.R.drawable内にシステムデフォルトのアイコンが多数用意されている
 item.setIcon(android.R.drawable.ic_menu_preferences);
 // キーボードショートカット
 item.setAlphabeticShortcut('e');
 return super.onCreateOptionsMenu(menu);
}

@Override
// オプションアイテムクリック時のイベント
public boolean onOptionsItemSelected(MenuItem item)
{
 switch (item.getItemId())
    {
    case MENU_ID01:
     // メニューが選択されたときの処理
     break;
    default:
        break;
    }
    return super.onOptionsItemSelected(item);
}

@Override
// オプションメニューが閉じられたときのイベント
public void onOptionsMenuClosed(Menu menu)
{
}

2011年12月5日月曜日

実行時にeclipseのコンソールに謎のエラー


ファイルダイアログを作りたかったが
難しそうだったので、フリーの外部ソースをパクって来て
埋め込んだら、突然、以下のエラーが出て起動すらしなくなった。

ERROR: Unknown option '--no-crunch' ~

最初は、コードのバグを疑ったがようやらそうではなかった。
ググッてみたところ、SDK Managerのアップデートしたら解決した。
eclipseのアップデートからだけではダメなようで
SDK Managerを起動して、そこからキチンとupdateしましょう。

いままでのソケット通信をするアプリは、このバージョンで問題なく動いてたのだけど
何からの処理に依存して、上記のエラーが発生するのだろうか・・。

2011年8月30日火曜日

Java言語の不満

以下のように、インターフェースの実装を簡略化して書けるのだが
どうも無理やり押し込んだ感のある文法が好きになれない。
この場合、ローカル変数 localnum を
感覚的に参照出来るそうに見えるが、実際はできない。

その点、C#は、デリゲートやアクセッサがいい役割を果たしていて
かなり感覚的に読みやすいコードが書けるのでオススメだ。

public class Main implements InterfaceA
{
 private int classnum = 10;

 public void Test()
 {
  // パッと見でローカル変数も送れそうな感じがするが送れない
  int localnum = 10;

  // その場でインターフェースを実装
  ClassA a = new ClassA( new InterfaceA()
  {
   // 実装2
   @Override
   public void play()
   {
    //System.out.println("実装1, num=" + localnum); // 当然ローカル変数は NG
    System.out.println("実装1, num=" + classnum);
   }
  });

  a.play(); //  実装1がよばれる

  // 通常
  ClassA b = new ClassA();
  b.setInterfaceA(this);
  b.play(); //  実装2がよばれる
 }

 @Override
 public void play()
 {
  System.out.println("実装2, num=" + classnum);
 }
}
※補足 最近知ったのですが、C# 2.0 では匿名メソッドという機能が用意されていて 上記と似たようなかたちで、delegateに直接関数を実装できるようです。