/* */ /* */

2012年12月7日金曜日

【Android】Ingressでポータル追加申請の方法【Ingress】

Googleの出したAR技術用いたゲーム「Ingress」

遊びたいのにポータルが全然近くに無いよ!!

って事でポータルの申請方法纏めておきます。


てか公式?にあるんですけどね・・・
ポータル追加方法とかの公式


Google先生にお力を借りて日本語訳


新規ポータルの提出

ポータル候補地の撮影と提出をする事によって、プレイフィールドへの追加の手助けをして下さい。
候補ポータルを送信する手順は次のとおり
  • カメラアプリでのGPSが有効になっていることを確認してください(オープンカメラ > [設定]> [ ストアの場所 > ON、オンにする必要があるかもしれない設定 > 位置情報サービス > 共有ピクチャの場所、利用可能な場合)。
  • 標準のカメラアプリでは、まずAndroid携帯で写真を撮る
  • 写真のオプションで共有を選択、
  • 共有「NIA Super Ops (入口ロゴ付き)」を選択
  • ポータルと提案するタイトルを入力して[OK]を選択
  • これは、オブジェクトの写真と場所で私たちのアンティックオプスチームに送る電子メールを準備します。
  • 電子メールを送信します。
  • 当社の運用チームは、画像やオブジェクトの位置を確認し、それがポータルのための私達の一般的な基準を満たしている場合、ゲームデータベースに追加します。
一般ポータル基準:
  • 安全と公衆がアクセス可能である必要がある事
  • オブジェクトの例の種類:
    • 独自のアーキテクチャ
    • 屋外壁画
    • 歴史的建造物
    • 特別な屋外ビル
    • ユニークな地元企業
ポータルが受け入れられるかどうかの決定は、2〜3週間以内に行われます。
受け入れられた後、2-3週で実際にそのポータルが活用される事を期待します。


・・・こんな感じ?訳は適当なので原文をご参照ください!
自分の場合は、撮った写真を「プレビュー」で開いて、
メニューボタン押して、「共有」から「NIA Super Ops」が選択できました。

実際にやってみると。

 写真を撮って・・・
 共有からNIA Super Opsを選択
 タイトル入力して

メーラーで送信!(実は英語で入力し直しました)













以上、ポータルの追加申請方法でした。

2012年12月5日水曜日

【Android】 Google発、AR技術とGPSを用いたゲーム【Ingress】

Googleから招待コードが届いたため、ちょっとだけプレイしてみました。
※チュートリアルのみですが、思いっきりネタバレ含みます。












Ingressの説明とかできればいいのですが、
自分も全然内容を知らないままやっております。

なんか、リアルなマップ使った陣地取りゲームみたいです。
これからはこういうゲームも増えて来るのかな・・・


右上の「OPS」からオプション開いて、
「MISSION」から各種チュートリアルを開始できます。


ってことでチュートリアル開始。
・・・の筈が。
良くわからないうちに1個目クリアしてしまっていました(笑



"聞こえますか?大事な事を言いますので良く聞いて下さい。"
"堅くなる必要はありません。これは形式的な物です。"
"あなたはゲームだと思ってダウンロードしたのでしょうが、それは違います!"
"根本て的に間違っているのです。"
"私たちの世界に浸透している、起源も意図も不明な未知のエネルギーがあります。"
"それは「エキゾチック物質」として知られています"

う〜ん、誰か英語教えて・・・
取りあえず、いつの間にかクリア(この台詞聞く事がミッションだったのかな?)


ってことで気を取り直して二つ目から・・・

"あなたの周りにある「XM」(エキゾチック物質)を集めて、スキャナを充電してね♪"






なんか、適当に歩いて光るってる奴(多分エキゾチック物質)
をある程度集めるとミッションクリアみたいです。
あまりにもサクッと終わったのでスクリーンショット全然撮ってない(笑
なんか、クリアした時にもメッセージ来てた筈。。。


てことで3つ目のミッション!



"ポータルへ行き、ハックせよ"
ハックは制圧とかそんな感じなのかな?







"ミッション-ポータルを制圧せよ"
"概要"
"-ポータルへ向かえ"
"-ポータルをタップしハックしろ"
(ポータルまで行ってポータルを画面で選択して、
「HACK」ボタン押せ。って事w)


"近くにポータルがあります"
"マップに表示されている円内にポータルが入るようにし"
"マップ上でポータルをタップします"
"HACKを選択してください"
"警告、これは敵対ポータルです"
"ハッキングした後、速やかに範囲外に移動して下さい"




え、離れなきゃ行けなかったのか・・・
SS撮るの夢中で全然読んでなかった(笑

ポータルが近くにあるとこんな感じに表示されます。
後は、近づいてポータル選択してハックすればオーケー!











こんな感じでミッションやっていきます。
一通りチュートリアルクリアしたけど、長くなりそうなんでブログはここまで。
(まだ倍以上SS撮ったけど面倒w)
後は実際にやってみてくださいな

道ばたでAndroidに目を落とす事に成りますので、周りには十分気をつけましょう!
でもって結構面白そうなので興味がありましたら是非!!


そいえば、何か機密文書っぽいのもゲット!






















2012年12月2日日曜日

【iPhone】Invalid Binary で陥った問題【ローカライズ】


Invalid Binaryに至る考えうる問題は一つではないため、
ここでは自分の陥った問題に関して紹介致します。

スプラッシュ画面(Launch Images)をローカライズ(多言語化)させて居たのですが、
それがマズかったようで、Default.pngとかを見つけられないとか言われました。

結論だけを言うと、info.plistファイルから該当する画像の列を削除すれば通りました。
削除した状態でもスプラッシュ画面は表示されるようです。
削除するのはinfo.plistの
Iconfilesの中とIconfiles(iOS5)->PrimaryIcon->iconfilesの中
にあるDefault.pngとDefault@2x.pngでした。

2カ所にある事に注意して下さい。


以下は、InvalidBinaryの段階でAppleから来たメールです。
Dear developer,
We have discovered one or more issues with your recent delivery for "DotToDot by Puzzles' Plaza". To process your delivery, the following issues must be corrected:
Invalid Image Path - No image found at the path referenced under key "CFBundleIcons": Default.png
Invalid Image Path - No image found at the path referenced under key "CFBundleIcons": Default@2x.png
Once these issues have been corrected, go to the Version Details page and click "Ready to Upload Binary." Continue through the submission process until the app status is "Waiting for Upload." You can then deliver the corrected binary.
Regards,
The App Store team

【Android】カラーコード一覧をxmlに纏めてみた【レイアウト】

12月に入り、アドベントカレンダーが始動しはじめたようです。

自分も参加したかったのですが、どうもマトモなネタをやっている時間が取れそうに無い・・・
でも悔しい
取りあえず12月中はブログの更新頻度を出来るだけ上げてアドベントカレンダーに対抗する事を目標にしようかと思います。


さて、そんなこんなで本題です。

Androidでレイアウトを弄ってる際「こんな感じの色が良いなぁ」
とか思い浮かべるかと思います。

そして、16進数で色を作って行く訳ですがコレが何かと面倒で・・・
サイトのカラーコード表を見ながらああでもないこうでもないと・・・

って事で、何番煎じか分かりませんが纏めてみました。

参考サイトは原色大辞典さんです。

githubに載せてあるのでどぞです。
https://github.com/Shift-Kumagai/AndroidLayoutColorXML

2012年11月26日月曜日

【iPhoe】価格の多言語対応について【StoreKit】

またもやiPhoneの話題です。
いい加減Androidに触りたいです。Rubyでも遊びたいです。


さて、今回の話題はiPhoneでの多言語対応、特に課金処理部分で私が躓いた点です。

課金処理の入ったiPhoneアプリで多言語対応にする際、
問題となるのは金額の表記だと思います。

日本の人には円表記で、海外の人には米ドル表記にしたい!となった時にどうするかなのですが、
公式のリファレンスそのままでオーケーです。


- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)responseの中で


NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setLocale:product.priceLocale];
NSString *formattedString = [numberFormatter stringFromNumber:product.price];


この様にするだけで、自動で価格の表記が変わってくれます。

さて、ここで問題なのが”何に合わせて”表記が変化するのかです。
自分は最初、他の部分のローカライズと同じで、iPhone本体の言語設定から拾ってくれるのだろうと考えておりました。
実際は、”最後にログインしたAppleアカウントに紐付いている国”の表記がされます。
多分、請求とかでややこしくなるのを避ける措置なのかなと思います。

なので、本体設定を英語にして、表記をUSに設定しても、円単位の数字が返って来る事があります。
テストする時は他の国に設定したアカウントでログインする様にしてください。
ホント面倒です・・・


【iPhone】課金処理が勝手に走る状態の防止【StoreKit】

※この記事の内容はどう考えても推奨されません。その場しのぎです。
 実装しちゃって課金処理で不利益出ても何も出来ません。

※iOS7、iOS8で再度組み直してみたのですが、今コレ使えないみたいです。
 ダイアログ出る前にSKPaymentTransactionStatePurchasingが
 飛んできませんでした。

何やらiPhoneの課金処理に関する掲示板などを見ていると、
「アプリを起動すると何故か課金処理が走ってしまう」
というのを時々見かけます。

取りあえずその場しのぎの策に行き着いたので書き残します。

iPhoneアプリを起動して、特に操作をしていないのに、
課金のダイアログが出て、IDとパスワードを求められる事があります。
これは、前回何かしらのアプリを起動して、課金処理に入り、
課金処理が正常に終了しないままアプリが落ちるとなります。
次回起動した後、特定のタイミング(StoreKitさんが要らん親切で通知してくれます。)でダイアログが呼び出されます。

本当に厄介!!

この問題に突き当たるという事は、公式のプログラミングガイド通りに、
アプリ起動直後にオブザーバー(何か課金処理を管理してるっぽい奴)の登録をしているのだと思われます。
そすると、最初に登録したオブザーバーさんが律儀に途中で終わっちゃってるトランザクションを拾って来てくれるみたいです。(しかもストアキットさんの任意のタイミングで・・・)

なので。。。

これ破棄すればオーケー

「ちゃん再処理しろよ」という白い林檎からのプレッシャーを感じますが取り合えず無視
 だっていきなりダイアログ出てくるとか不審過ぎるし、タイミング取得できる様な仕組みも見当たらないし・・・


本題です。
ここではNonCondensableな課金を例として挙げております。


AppDelegate.h

@interface AppDelegate : UIResponder 


AppDelegate.m
//未完トランザクション用

-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions{

    for (SKPaymentTransaction *transaction in transactions) {

        switch (transaction.transactionState) {

    

            case SKPaymentTransactionStatePurchasing: {// 購入中

                [queue finishTransaction:transaction];

                //アイテムID取得したいならこの部分

                break;

            }

            case SKPaymentTransactionStatePurchased: {// 購入成功

                [queue finishTransaction:transaction];

                break;

            }

            case SKPaymentTransactionStateFailed: { //購入失敗/中断

                [queue finishTransaction:transaction];

                break;

            }

            case SKPaymentTransactionStateRestored: {// 購入履歴復元

                [queue finishTransaction:transaction];

                break;

            }

        }

    }

}


//オブザーバーの削除(NSNotificationCenterで呼ばれる)


-(void)removeTransaction {

    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];

}

//オブザーバーの登録(NSNotificationCenterで呼ばれる)

-(void)addTransaction {

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

}


//なんか、スプラッシュ画面で呼ばれてる部分


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

{

    〜〜〜〜〜〜〜

    //何か色んな処理 

    〜〜〜〜〜〜〜


    //オブザーバーの登録

    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];

    

    // 通知センターに登録

    //オブザーバーの破棄をするメソッド

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(removeTransaction) name:@"remove" object:nil];

    //オブザーバーの登録をするメソッド

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addTransaction) name:@"addtran" object:nil];

}
という具合に、アプリ起動時に未完トランザクション用のオブザーバーの登録を済ませてしまいます。
未完トランザクションがあった場合、-(void)paymentQueueホニャララが呼ばれますので取りあえずfinishTransactionを呼んじゃいます。
ダイアログが表示されるのは、1回目に
-(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
に入った後(1回目は購入中に入ります)なので、そこで終了させてしまえば
ダイアログは出ないみたいです。
「任意のタイミングで処理したい」ならば、「//購入中」の部分で
アイテムIDを適当なArrayにでも突っ込んで、
お好きなタイミングで課金処理を走らせると良いかと思います。
取りあえず破棄完了!!
でもこのままだと、未完じゃない新規のトランザクションまで破棄されちゃいます。
なので、別に実際の課金処理を用意してやります。
MyStoreObserver.h
#import 
@interface MyStoreObserver : NSObject
@end
MyStoreObserver.m
@implementation MyStoreObserver
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
{
    NSLog(@"paymentQueue:updatedTransactions");
    for (SKPaymentTransaction *transaction in transactions)
    {
        switch (transaction.transactionState)
        {
            case SKPaymentTransactionStatePurchasing:
            {
                // 購入処理中
                break;
            }
            case SKPaymentTransactionStatePurchased:
            {
                [queue finishTransaction:transaction];
                // 購入処理成功時の処理
                break;
            }
            case SKPaymentTransactionStateFailed:
            {
                [queue finishTransaction:transaction];
                // 購入処理エラー。ユーザが購入処理をキャンセルした場合もここにくる
                // エラーが発生したことをユーザに知らせる
                // [self failedTransaction:transaction];
                if (transaction.error.code != SKErrorPaymentCancelled){
                    //エラーの場合
                } else {
                    //ユーザーがキャンセルした場合
                }
                break;
            }
            case SKPaymentTransactionStateRestored:
            {
                [queue finishTransaction:transaction];
                // リストア処理
                [self restoreTransaction:transaction];
                break;
            }
        }    
    }
}
// 全てのリストア処理が終了(その後、「購入処理の終了」が呼ばれる)
- (void)paymentQueueRestoreCompletedTransactionsFinished:(SKPaymentQueue *)queue 
{
     //何かの処理   
}
// リストアの失敗(cancel時も呼ばれる)(その後、「購入処理の終了」は呼ばれない)
- (void)paymentQueue:(SKPaymentQueue *)queue restoreCompletedTransactionsFailedWithError:(NSError *)error
{
    //何かの処理
}
// 購入処理の終了
- (void)paymentQueue:(SKPaymentQueue *)queue removedTransactions:(NSArray *)transactions 
{    
    //南下の処理
}
@end

んでもって、後は実際課金走らせる部分で
○○○.m
//上の方で宣言しておく
MyStoreObserver *mySKObserver;
~~~~~
~~~~~
//ここでダミー破棄の通知
NSNotification *n = [NSNotification notificationWithName:@"remove" object:self];
[[NSNotificationCenter defaultCenter] postNotification:n];
//重複すると怖いので一応破棄。多分無くても大丈夫
[[SKPaymentQueue defaultQueue] removeTransactionObserver:mySKObserver];
//実際に走らせるオブザーバーを登録
[[SKPaymentQueue defaultQueue] addTransactionObserver:mySKObserver];
~~~~~~~~~~
~~~~~~~~~~
-(void)viewWillDisappear:(BOOL)animated{
    //使い終わったオブザーバーをここで削除
    [[SKPaymentQueue defaultQueue]removeTransactionObserver:mySKObserver];
    //ノーティフィケーションも削除
    [[NSNotificationCenter defaultCenter]removeObserver:self];
    
    //一応もう一回ダミーを立てるべきだろうか・・・
    //NSNotification *n = [NSNotification notificationWithName:@"remove" object:self];
}

という感じで、ダミーのオブザーバーと実際に課金走らせるオブザーバーを交換して上げる。
取りあえずはこれで動いてる感じ!!
参考サイト様一覧
【なんてこったいブログ】
http://nantekottai.com/2011/10/28/storekit/
【アルデンテ】
http://d.hatena.ne.jp/kozy_twt/20110401/1301680959
In-App Purchaseプログラミングガイド
https://developer.apple.com/jp/devcenter/ios/library/documentation/StoreKitGuide.pdf



2012年11月14日水曜日

【iPhone】iPhoneでデバッグ時にだけ走るコード【デバッグ】

今回はiPhoneアプリのお話。(Javaが打ちたい。。。ブログ書く時間ない。。。)

取りあえず私のやらかしたお話・・・
iPhoneアプリのデバッグコード有効のままリリースしちゃった☆

こんなミスを二度と繰り返さない様に、デバッグの時だけ有効になる
コードの書き方を残しておきます。

#define DEBUG 1
とか書いて
if(DEBUG){〜〜}
とか書いていたのですが、この"DEBUG"を書き間違えるというミスを今回侵しました。
なので、ビルドコンフィギュレーション(BuildConfiguration)によって自動で
読み込む部分を変える様にしてみます。

Xcode左側のファイル一覧からProjectを選択
Project->BuildSettings->Apple LLVM compiler 4.1 - Preprocessing










夫々で対応したコンフィグに対する定数を入れて行きます。
自分はデバッグ環境の時のみ1になるようにしております。
これで、#define定義した時と同じ動きをする模様。
しかも、リリースとかデバッグとかアドホックとかのビルド環境によって値を変えられます!

後はコード内で
if(DEBUG){
    //デバッグ時にのみ走らせたいコード
}else{
    //本番時にのみ走らせたいコード
}
という書き方をすればオーケー。

なんか、Xcodeのバージョンによっては最初からDEBUG=1が
設定されている事もあるようです。

序でに、こちらのサイトさんでは、デバッグ構成時にだけ走るLogの書き方が載っておりました。
http://goo.gl/OFDqY


最近Rubyのお勉強始めました。

2012年5月20日日曜日

【Android】Android標準レイアウトを変更してみる【レイアウト】

【ここの部分は読み飛ばしても大丈夫です】

お仕事でTabView使っていたのです。

TabViewって標準でテキストにアニメーションが入ってて、長すぎるテキスト
入れると、文字が小さくならずに、選択時にアニメーションで隠れた文字が
出てくるようになるんですよね。
その為、標準のプロパティの中にはテキストサイズ(Textsize)の変更が存在
していません。

そんな中で言われたのが・・・

お客様「アニメーション要らないからテキストサイズ小さくして」
私「(; ゚д゚)・・・はい。。。」

まぁ、Viewのxml手打ちすれば良いかとか思っていたのですが、現在のレイ
アウトに特に不満を持っているわけでも無さそうだったので、できる限りレイ
アウト弄りたくない!(メンドウだし)。。。
そう思って調べたらありました!



【やっと本題】
さて、今回はTabViewを例として挙げていますが、結構色んなレイアウト変更
することが出来るみたいです。

※それと、これ書きながらテストコード打っていたのですが、自宅のSDKのバー
ジョンが古いようで、会社の時とは挙動が違いました。今回の画像ではタブの
イメージとタブの文字が被ってしまっていますが、最新のSDKでは自動でイメー
ジのサイズが調整されたはずです。余裕あったら後で直します。。。

まずは普通に実装します。

TabTestActivity.java
import android.app.Activity;
import android.app.TabActivity;
import android.content.res.Resources;
import android.os.Bundle;
import android.widget.TabHost;

//継承はTabActivityなのをお忘れなく
public class TabTestActivity extends TabActivity{
 /** Called when the activity is first created. */
 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  //リソースフォルダ
  Resources res = getResources();

  //タブの本体作成
  TabHost tabHost = getTabHost();

  //多分タブ夫々の本体?
  TabHost.TabSpec spec;

  //Tab夫々を作っていきます。今回は3つ////////////////////

  //1個目
  spec = tabHost.newTabSpec("tab1")
    .setIndicator("Tab1test",
      res.getDrawable(R.drawable.ic_launcher))
      .setContent(R.id.Tab1);
  tabHost.addTab(spec);

  //2個目
  spec = tabHost.newTabSpec("tab2")
    .setIndicator("tab2test",
      res.getDrawable(R.drawable.ic_launcher))
      .setContent(R.id.Tab2);
  tabHost.addTab(spec);

  //3個目
  spec = tabHost.newTabSpec("tab3")
    .setIndicator("tab3testてすとてすと",
      res.getDrawable(R.drawable.ic_launcher))
      .setContent(R.id.Tab3);
  tabHost.addTab(spec);

  //Tabが呼び出された時、どこを起動画面にするか選択(0からだよ)
  tabHost.setCurrentTab(0);

  //////////////////////////////////////////////////////


 }
}
main.xml

<?xml version="1.0" encoding="utf-8"?>
<TabHost xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/tabhost"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >

        <TabWidget
            android:id="@android:id/tabs"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />

        <FrameLayout
            android:id="@android:id/tabcontent"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" >

            <LinearLayout
                android:id="@+id/Tab1"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >

                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:text="Tab1の表示" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/Tab2"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >

                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:text="Tab2の表示" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/Tab3"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent" >

                <TextView
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:text="Tab3の表示" />
            </LinearLayout>
        </FrameLayout>
    </LinearLayout>

</TabHost>




実装画面
※イメージとテキストの重なりは最新のSDKなら自動で修正してくれるはずです。

 さて、この時のTab3の文字が微妙に枠からはみ出しているのが確認頂けますでしょうか?
 これの修正やっていきます。
 残念ながらTabWidgetのプロパティにはテキストサイズの項目が無いようで、
android:textsize ="10sp"なんてのができません。 そこで、Android標準のレイアウトを変更
する事にします。




まず、style.xml作ります。


中身はこんな感じ

style.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>

    <style name="MyTheme" parent="android:Theme">
        <item name="android:textViewStyle">@style/MyTextView</item>
    </style>

    <style name="MyTextView" parent="android:Widget.TextView">
        <item name="android:textSize">10sp</item>
    </style>

</resources>



この"Theme"ってのを使うと、アプリ内の特定の標準レイアウトだけを変更
できるらしいです。
今回はTabのtextSizeを"10sp"に変更してみます。


styleが書けたので、これをAndroidManifest.xmlに読み込ませます。


AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.kumagai.shift"

    android:versionCode="1"

    android:versionName="1.0" >



    <uses-sdk android:minSdkVersion="7" />



    <application

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name" >

        <activity

            android:name=".TabTestActivity"

            android:label="@string/app_name"

            android:theme="@style/MyTheme">

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />



                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>



</manifest>
<activity>の部分にandroid:theme="@style/MyTheme"を追加しました。



これで起動すると・・・

この様になります。
Tabの文字が小さくなっているのが確認できますでしょうか?
Tab3の文字が見きれていたのが改善されました。

Activity全体に適応されるので下のLinerLayoutのTextViewでも文字が小さく
なってしまっていますが、こちらは個別に変更可能なため、適当に

<TextView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:text="Tab2の表示"
android:textSize="100sp" />



とでもやれば・・・



















でかくなります(笑


Themeで変更可能なものが結構御座います。
どこかに一覧みたいなのあったはずだけど、どこで見つけたか忘れてしまった。。。


参考サイト
  Y.A.M の 雑記帳 詰まった所があり探すと、必ずといって良い程解決策が載ってるサイト様
  Tech Booster ここもよく行き着きますねw





Androidのデザイン関連ですと、この辺りの書籍は目を通しておくと良いかも。。。

2012年3月3日土曜日

【Android】App Engine Connected Android Project を取り敢えず動かす【GAE】

Ecripseを見ていたらApp Engine Connected Android Projectというものを発見(綴り合ってる?)

何かカッコイイ!!

ということで取り敢えず動かしてみる。

GAEの登録終わってない方は終わらせてからこのページをご覧下さい。
まぁ、誰も見てないだろうけど。。。

WinVista
Ecripse3.7 日本語プラグイン
後色々ゴチャゴチャとプラグイン入れてる環境です。



取り敢えず、プロジェクトを作成していきます。

ファイル->新規->その他->Android->App Engine Connected Android Projectを選択。



次に、プロジェクト名とパッケージ名を入れていきます。
自分はプロジェクト名を「GdgdTest」パッケージ名を「com.gdgdtest」と適当に設定







最後にC2DMの設定を行います。
パッケージ名とC2DMに登録した(又はこのあと登録する)メールアドレスとパスワードを入れましょう。Gmailでしか作ってないので他のアドレスで行けるか分からないです。



最後に「完了」を押しましょう。
ちょっと重くなった後にプロジェクトが作成されてます。


AndroidやGAEのプロジェクトは作った初期状態でそのまま実行すれば動くのですが、
これはそのままでは動いてくれない模様。。。
ということで、設定や登録やっていきます。

まず、C2DMに登録されていない方はこちらで登録をしてください。
http://code.google.com/intl/ja/android/c2dm/signup.html

大事なのはパッケージネームとemailのアドレス。
先程プロジェクト作成時に入力したものを使ってください。(この作業先にやるべきだった?)
ぶっちゃけそれ以外は適当でも・・・


さて、またEcripseに戻りまして、
先程プロジェクトを作成したので、AndroidとGAEの2つのプロジェクトができていると思います。
自分の場合は「GdgdTest-Android」、「GdgdTest-AppEngine」の2つが作成されました。





この内のAndroidの方にあるsrc->com.gdgdtest->「Setup.java」を見てみましょう。
確認すべき点は2行です。



ここではAPP_NAMEにGAEのIDを入力しましょう

    private static final String APP_NAME = "【GAEで登録したID(デプロイするURLの一部)】";

    public static final String PROD_URL = "https://" + APP_NAME + ".appspot.com";

こっちでは、C2DMで登録したメールアドレスが入っていることを確認しましょう。
    public static final String SENDER_ID = "○○○○@gmail.com";




次に、GAEのアプリケーションIDの設定を行います。
GAEのプロジェクトを右クリックしてプロパティを選択します。
Google->Appエンジン の「デプロイメント」にある「アプリケーションID」に
GAEで設定してあるアプリケーションIDを割り当てます。(上のAPP_NAMEと同じ)



後はAndroidプロジェクト選択した状態で実行。
GAEの方はデプロイしてやる。


Androidで何か許可求められるので許可してやる。

こんな感じで「Registerd」が通知されれば成功


次にSayHello?押して


こんなんが返ってきたら成功!



序に、ブラウザからGAEのページに行ってみる。
http://【自分のID】.appspot.com/



SayHelloを押すと

こんな感じ



対象のandroidのGmailアドレスとメッセージを入力すると


Androidの方にこんな感じでgdgdTestの通知が送られました。


これで終了。


ブラウザから特定の端末に向けてメッセージ送れるって凄いね。
リモート操作とかも頑張ればできちゃう?

2012年3月2日金曜日

【GAE】頑張って乗せてみたい【Gosen】

GAEでGosen使ってみたいなと適当に模索。

何とかなりそうなのでこれも忘却録として参照サイトのみ書いておく。



GAE用にGosenのプロジェクトを書き換えてくれているサイト
http://www.altus5.co.jp/wordpress/jikken/gaej-gosen-n3/

GosenのdictionaryのXMLの指定URLが繋がらないようなのでその書き換えについて書いてくれてるサイト
http://shinodogg.com/?p=3964




面倒なのでリンクのみ載せておく。
でもリンク切れが怖いからそのうち自分でもまとめるべき?


追記:
lucene-gosenたるものを発見。
jar一つ追加で中に辞書も内包してくれてるお得ライブラリ。
コレで良かったよ・・・


2012年2月22日水曜日

【忘却録】Androidで陥ったエラー文

java.net.UnknownHostException: api.twitter.com

ソース見なおしてもコレに陥って困ってたら、
AndroidMainifestにパーミッション追加してないだけだった。

<uses-permission android:name="android.permission.INTERNET" />
<application  
        うんたらかんたら
/>

これでOK
なんか悔しいから書いておく。

2012年2月19日日曜日

【Android】Eclipseの初期設定

Android開発の前にEclipseの初期設定

Eclipseは初期状態だと文字のエンコードが「MS932」(Shift-JIS)です。

この状態だとコード中に日本語が混じると正しく表示されなかったり、

ビルドできなくなるなどの問題が生じる可能性があります。

なので、取り敢えず「UTF-8」に変更しておきましょう。

Eclipseの「Window」→「Preference」、左側の「General」→「workspace」そこの下にある

「Text file encoding」を「Default」から「Other : UTF-8」に変更しましょう。


序にJavaコンパイラの文法チェックのレベルの変更も書いとく

AndoroidではJava1.5レベル以上の環境でのチェックが必要

初期設定のままだとJava1.4のハズ。なのでそれの変更

左側の「Java」→「Complier」その欄の「Compiler Compilance level」を1.6とか高い奴に設定

最後に「Applay」→「OK」。

やんなくても動いてたけど忘却録として一応書いとく。

2012年1月20日金曜日

【忘却録】Ubuntu_eclipseの補完キー割り当て変更(Ctrl + Space)

UbuntuでEclipse使ってたら、補完のキーが「Alt+/」で凄い使いづらい。(慣れの問題なのかもしれないけど・・・)
なので変更の仕方を一応残しておく

まずはIMEの切り替えを無効にする
1.Ubuntuの「システム→設定→iBusの設定」を選択
2.一般タブのキーボードショートカット→切り替え: の欄からCtrl+Spaceを削除(右側の「...」から)
3。閉じる

次にEclipseの設定変更
1.Window→Preferencesを選択
2.General→Keys 右側の一覧から「Content Assist」を選択
3.Bindingの欄を「Alt + /」から「Ctrl + Space」に変更
4.Apply→OK

小さな事だけど一々調べるの面倒だし書いておこう。