2011年5月3日火曜日

Settingsアプリのアプリケーション詳細画面を呼び出してみる

呼び出し方法

APIレベル9よりSettingsクラスに「ACTION_APPLICATION_DETAILS_SETTINGS」が追加されています。
Developerサイトより

Activity Action: Show screen of details about a particular application.
In some cases, a matching Activity may not exist, so ensure you safeguard against this.
Input: The Intent's data URI specifies the application package name to be shown, with the "package" scheme. That is "package:com.my.app".
Output: Nothing.
Constant Value: "android.settings.APPLICATION_DETAILS_SETTINGS"
IntentにはActionと表示したいアプリケーションのpackageスキームを指定します。
ソースコード上はこんな感じでしょうか。
(※actionの指定が直書きですが気にしないでください)


startActivityForResult(new Intent("android.settings.APPLICATION_DETAILS_SETTINGS",
                             Uri.parse("package:[起動したいアプリのPackageName]") )),0); 


2011年5月2日月曜日

検索キーでアプリ起動したい

やりたいこと

検索キー長押しで特定のActivityを起動したい。
デフォルトは音声検索が起動しますが、自分はあまり必要としないので、別のアプリを起動したい。


実現方法

AndroidManifest.xmlにintent-filterを記載すれば起動可能。
<intent-filter>
    <action android:name="android.intent.action.SEARCH_LONG_PRESS" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

2011年4月30日土曜日

新しいAdmobを導入してみた

ライブラリをworkspaceに格納

・「libs」フォルダを作成し、GoogleAdMobAdsSdkXXX.jarを格納する
・プロパティ設定のLibrariesから上記のjarファイルを追加する

詳しくは以下のサイトを参照
Google AdMob Ads Android Fundamentals


AndroidManifest.xmlの変更

以前は<meta-data>が必要でしたが、最新版では不要。
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"</>

<activity android:name="com.google.ads.AdActivity"
          android:configChanges="keyboard|keyboardHidden|orientation"/>



Layoutファイルで定義する場合


xmlns:ads="http://schemas.android.com/apk/res/[PACKAGE_NAME]"

 <com.google.ads.AdView android:id="@+id/adView"
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         ads:adUnitId="[YOUR_PUBLISHER_ID]"
                         ads:adSize="BANNER"/>


xmlns:adsの記載を忘れがちなので注意。
valuesフォルダに以下のような「attrs.xml」を作成


<?xml version="1.0" encoding="utf-8"?>
<resources>
  <declare-styleable name="com.google.ads.AdView">
      <attr name="adSize">
          <enum name="BANNER" value="1"/>
          <enum name="IAB_MRECT" value="2"/>
          <enum name="IAB_BANNER" value="3"/>
          <enum name="IAB_LEADERBOARD" value="4"/>
      </attr>
      <attr name="adUnitId" format="string"/>
  </declare-styleable>
</resources>



ActivityのJavaソースに記載

・AdView.loadAd(new AdRequest())をコールしないと表示しません
・AdView.setAdListener()でListenerを登録すると何かと便利

    mAdView = (AdView) findViewById(R.id.adView);
     mAdView.setAdListener(new AdListener() {
 
   @Override
   public void onDismissScreen(Ad arg0) {
    // TODO Auto-generated method stub
   }

   @Override
   public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {
    // TODO Auto-generated method stub
   }

   @Override
   public void onLeaveApplication(Ad arg0) {
    // TODO Auto-generated method stub
   }

   @Override
   public void onPresentScreen(Ad arg0) {
    // TODO Auto-generated method stub
   }

   @Override
   public void onReceiveAd(Ad arg0) {
    // TODO Auto-generated method stub
   }
        });
     
     mAdView.loadAd(new AdRequest());

2011年4月25日月曜日

twicca マッシュルーム プラグイン Ver0.0.3をリリースしました

twicca マッシュルーム プラグイン Ver0.0.3をリリースしました。
変更点は
・「使用順表示」を追加。使用回数が多いほど

「使用順表示」の選択

設定手順:
1.twicca起動
2.メニュー表示
3.その他→設定→プラグイン設定→ツイート編集プラグイン→マッシュルームプラグイン
4.「使用順表示」のチェックON/OFF

2011年2月9日水曜日

SimpleDateFormatのコンストラクタ

先日のnfcの記事中ソース、
SimpleDateFormat dfl = new SimpleDateFormat("yyyy/MM/dd HH:mm");

がローカライズされていなんじゃないかとご指摘いただきました。
はい、その通りです。ローカライズされていません。
android.comのreference参照

じゃあ、ローカライズされたフォーマッタが必要な場合どうしたらいいの???
それは、以下のDateFormatクラスのファクトリーメソッドから取得可能です。
DateFormat df = DateFormat.getDateInstance()
DateFormat df = DateFormat.getDateTimeInstance()
DateFormat df = DateFormat.getTimeInstance()
(※SimpleDateFormatのクラスが使いたいなら、SimpleDateFormatにキャスト)
android.comのreference、DateFormat参照

アプリケーションのUI部分でローカライズされた日時を表示するときは、
上記のファクトリーメソッドから取得すればいいですね~。

2011年2月7日月曜日

android2.3のNFCを利用してSuicaの入退場記録を表示

Kazzzさんが公開されている nfc-felica http://code.google.com/p/nfc-felica/ をカスタマイズして入退場記録を表示してみました。
f:id:baroqueworksdev:20110206231651p:image


入退場記録のフォーマット

以下のサイトを参考にしました。
http://jennychan.web.fc2.com/format/suica.html#108F

カスタマイズ箇所

・入退場記録クラスをSuica.javaに追加
public static class Inout {
        final byte[] data;
        Context context;  
        /**
         * コンストラクタ
         * @param data データのバイト列(16バイト)をセット
         * @param context androidコンテキストをセット
         */
        public Inout(byte[] data, Context context) {
            this.data = data;
            this.context = context;
        }
        
        public String getConsoleType(){
         switch(data[0]){
         case (byte) 0x00:return "清算出場";
         case (byte) 0x20:return "出場";
         case (byte) 0x21:return "駅務機器出場";
         case (byte) 0x40:return "定期出場";
         case (byte) 0xA0:return "入場";
         case (byte) 0xC0:return "定期入場";
         }
   return Byte.toString(data[0]);
        }
        /**
         * 入場駅を取得します
         * @return String バスの場合、序数0に会社名、1停留所名が戻ります 
         *  鉄道の場合、序数0に会社名、1に路線名、2に駅名が戻ります
         */
        public String[] getEntranceStation() {
//                if ( this.isByBus() ) {
//                    //バス利用の場合
//                    return getBusStop(Util.toInt(new byte[]{this.data[6], this.data[7]})
//                            , Util.toInt(new byte[]{this.data[8], this.data[9]}));
//                } else {
                    //鉄道利用の場合
                    return getStation(0, this.data[2], this.data[3]);
//                }
        }





        /**
         *  地区コード、線区コード、駅順コードから駅名を取得します
         * 
http://sourceforge.jp/projects/felicalib/wiki/suicaを参考にしています
* @param regionCode 地区コードをセット * @param lineCode 線区コードをセット * @param statioCode 駅順コードをセット * @return 取得できた場合、序数0に会社名、1に路線名、2に駅名が戻ります */ private String[] getStation(int regionCode, int lineCode, int statioCode) { int areaCode = regionCode & 0xff; DBUtil util = new DBUtil(this.context); try { SQLiteDatabase db = util.openDataBase(); Cursor c = db.query(TABLE_STATIONCODE , COLUMNS_STATIONCODE , COLUMNS_STATIONCODE[0] + " = '" + areaCode + "' and " + COLUMNS_STATIONCODE[1] + " = '" + (lineCode & 0xff) + "' and " + COLUMNS_STATIONCODE[2] + " = '" + (statioCode & 0xff) + "'" , null, null, null, COLUMN_ID); return ( c.moveToFirst() ) ? new String[]{ c.getString(3), c.getString(4), c.getString(5)} : new String[]{"???", "???", "???"}; } catch (Exception e) { e.printStackTrace(); return new String[]{"error", "error", "error"}; } finally { util.close(); } } /** * 処理日付(出場日付)を取得します * @return byte[] */ public Date getProccessDate() { int date = Util.toInt(new byte[]{this.data[6], this.data[7]}); int yy = date >> 9; int mm = (date >> 5) & 0xf; int dd = date & 0x1f; int hh = Util.toInt(new byte[]{(byte) ((this.data[8]&0xf0) >> 4) }) * 10 + Util.toInt(new byte[]{(byte) (this.data[8]&0x0f)}); int min = Util.toInt(new byte[]{(byte) ((this.data[9]&0xf0) >> 4) }) * 10 + Util.toInt(new byte[]{(byte) (this.data[9]&0x0f)}); Calendar c = Calendar.getInstance(); c.set(Calendar.YEAR, 2000 + yy); c.set(Calendar.MONTH, mm-1); c.set(Calendar.DAY_OF_MONTH, dd); c.set(Calendar.HOUR_OF_DAY , hh); c.set(Calendar.MINUTE, min); return c.getTime(); } @Override public String toString() { NumberFormat nf = NumberFormat.getCurrencyInstance(); nf.setMaximumFractionDigits(0); SimpleDateFormat dfl = new SimpleDateFormat("yyyy/MM/dd HH:mm"); StringBuilder sb = new StringBuilder(); sb.append("入出場: " + this.getConsoleType() + "\n"); sb.append("日時: " + dfl.format(this.getProccessDate()) + "\n"); String[] entranceInfo = this.getEntranceStation(); sb.append(" 利用会社: " + entranceInfo[0]+ "\n"); sb.append(" 路線名: " + entranceInfo[1]+ "線\n"); sb.append(" 駅名: " + entranceInfo[2] + "\n"); return sb.toString(); } }

・NFCFeliCaReader.javaの入退場記録ボタンを有効化

未解決事項

フォーマットは分かったのですが、以下の事項が未解決です。
・入出場、使用装置種別
  → 0byte目のデータですが、すべての値が判明していない
・地域コードがわからない
  → 路線コード(2byte目)&駅コード(3byte目)は判明しているが、
   レコードの中に地域コードの値がない
・バス利用時は入退場に記録されるのか不明
  → こんどバスに乗ったときに履歴を除いてみます

2011年1月15日土曜日

twicca マッシュルーム プラグイン Ver0.0.2をリリースしました

twicca マッシュルーム プラグイン Ver0.0.2をリリースしました。
変更点は
・各マッシュルームごとに「変換モード」と「挿入モード」の選択
です。

「変換モード」と「挿入モード」の選択


設定手順:
1.twicca起動
2.メニュー表示
3.その他→設定→プラグイン設定→ツイート編集プラグイン→マッシュルームプラグイン


f:id:baroqueworksdev:20110116032737p:image 

f:id:baroqueworksdev:20110116032736p:image