Swift 備忘録 「バッテリーに関する情報の取得方法」

忘れそうなのでメモ

        var batteryStatusName: String;        

        let device = UIDevice.currentDevice();
        
        //これしないと全部Unknown返る
        device.batteryMonitoringEnabled = true;
        
        var batteryLevel = device.batteryLevel;
        
        switch device.batteryState{
        case .Full:
            //満充電
            batteryStatusName = "FULL";
            break;

        case .Charging:
            //充電中
            batteryStatusName = "Charging";
            break;
            
        case .Unplugged:
            //未接続
            batteryStatusName = "Unplugged";
            break;

        case .Unknown:
            //不明
            batteryStatusName = "Unknown";
            break;
            
        default:
            batteryStatusName = "";
            break;
            
        }

        //BatteryLevelは 0.0〜1.0で返る。Unknownの時は-1.0

        println("Battery \(batteryLevel) \(batteryStatusText)");

Fitbit API を Androidアプリから叩いてみた 取得編

今度は実際にログインしたユーザーの情報を取得してみます。

最初にアプリ登録時に発行された

①コンシューマーキー
②コンシューマーシークレット

認証後に受け取った

③アクセストークン
④アクセストークンシークレット

この認証の情報を使ってログインしたユーザーの情報を取得します


//おまじないなので認証時の使い回しでよし
                FitbitAPIEntityCache entityCache = new FitbitApiEntityCacheMapImpl();
                FitbitApiCredentialsCache credentialsCache = new FitbitApiCredentialsCacheMapImpl();
                FitbitApiSubscriptionStorage subscriptionStore = new                FitbitApiSubscriptionStorageInMemoryImpl();
                FitbitApiClientAgent apiClientAgent = new FitbitApiClientAgent(
                        apiBaseUrl, webBaseUrl, credentialsCache);

//二つぶち込む
    FitbitAPIClientService<FitbitApiClientAgent> apiClientService = new FitbitAPIClientService<FitbitApiClientAgent>(
                        apiClientAgent, "コンシューマーキー", "コンシューマーシークレット",
                        credentialsCache, entityCache, subscriptionStore);

                APIResourceCredentials resourceCredentials = new APIResourceCredentials(
                        "-", "アクセストークン", "アクセストークンシークレット");

                apiClientService.saveResourceCredentials(user,
                        resourceCredentials);

                FitbitApiClientAgent agent = apiClientService.getClient();

                LocalUserDetail user = new LocalUserDetail("-");

//ログイン済みユーザーの情報を取得
                try {

//情報を取得する日の日付を指定
                    LocalDate date = FitbitApiService.getValidLocalDateOrNull("2013-01-01");

                    Activities activities = agent.getActivities(user,
                    FitbitUser.CURRENT_AUTHORIZED_USER, date);

//歩数を取得
                    int steps = activitiesSummary.getSteps();

                } catch (FitbitAPIException e) {
                }


こんな感じで特定のユーザーの特定の日の値を取得できます。

どんな情報が取得できるかは Fitbit API のページを
読んで調べてみてね。

あとコール数は制限があるのできをつけてね!

Fitbit API を Androidアプリから叩いてみた 認証編

前回書いた 「準備編」からの続きです

実際にAndroidアプリでFitbitアカウントで認証をしてみましょう。

Fitbitもご多分に漏れずOAuth認証です。

FitbitのJava Wrapperがほとんどやってくれますのでとても簡単です。

流れとしては

 ①コンシューマーキーとコンシューマーシークレット、コールバックを渡して認証用URLを生成

 ②認証用URLをブラウザで開く

 ③ユーザーにメールアドレスとパスを入れて認証をしてもらう

 ④認証が正常に終わったらコールバックのURLをintent-filterで受け取りTokenとToken Secretを受け取る。

これでユーザーが自分のFitbitの情報を取得するのに必要な情報がそろいます。

コードは以下に

①&②認証用ページをブラウザで開く

//認証用とAPIの呼び出しの際に必要なURL
    String apiBaseUrl = "api.fitbit.com";
    String webBaseUrl = "https://www.fitbit.com";


//コールバック先を指定
    String callbackUrl = "fitbit://callback";

//おまじない 
     FitbitAPIEntityCache entityCache = new FitbitApiEntityCacheMapImpl();
     FitbitApiCredentialsCache credentialsCache = new FitbitApiCredentialsCacheMapImpl();
     FitbitApiSubscriptionStorage subscriptionStore = new FitbitApiSubscriptionStorageInMemoryImpl();
     FitbitApiClientAgent apiClientAgent = new FitbitApiClientAgent(
        apiBaseUrl, webBaseUrl, credentialsCache);

     apiClientService = new FitbitAPIClientService<FitbitApiClientAgent>(
        apiClientAgent, "自分のアプリのコンシューマーキー", "コンシューマーシークレット",
        credentialsCache, entityCache, subscriptionStore);

     LocalUserDetail userDetail = new LocalUserDetail("-");

     String authorizationURL = apiClientService
        .getResourceOwnerAuthorizationURL(userDetail,
      callbackUrl);

//ブラウザで認証ページを開く
     Uri uri = Uri.parse(authorizationURL);
     Intent i = new Intent(Intent.ACTION_VIEW, uri);
     startActivity(i);
     

④ブラウザで認証が済んだら指定したコールバックをintent filterで受け取る

認証後の受け取りようActivityなりをManifest.xmlに事前に設定しておこう

今回はcallback用Activityを1個作りました

        <activity
            android:name="com.abalol.fitbetter.callback"
            android:launchMode="singleTask" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data
                    android:host="callback"
                    android:scheme="fitbit" />
            </intent-filter>
        </activity>

最後に実際にActivityでcallbackのurlに含まれるトークン等を取得します。


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.callback);

        if (uri != null && uri.toString().startsWith("fitbit://callback")) {
            // oauth_verifierを取得する
            String verifier = uri.getQueryParameter("oauth_verifier");
            String token = uri.getQueryParameter("oauth_token");

            APIResourceCredentials resourceCredentials = MainActivity.apiClientService
                    .getResourceCredentialsByTempToken(token);

            if (!resourceCredentials.isAuthorized()) {
                resourceCredentials.setTempTokenVerifier(verifier);
                try {
                    MainActivity.apiClientService
                            .getTokenCredentials(new LocalUserDetail(
                                    resourceCredentials.getLocalUserId()));

                    // 認証完了
                    String AccessToken = resourceCredentials.getAccessToken();
                    String TokenSecret = resourceCredentials
                            .getAccessTokenSecret();

                } catch (FitbitAPIException e) {
                    e.printStackTrace();
                }
            }
        }

これで認証したユーザーの各情報を取得する準備が整いました

Fitbit API を Androidアプリから叩いてみた 準備編



先日 i̶n̶g̶r̶e̶s̶s̶用̶に̶ 健康のために Fitbitを購入してみました。

歩数の計算はもちろん距離や消費カロリーなど計算してPCやスマホ等の端末経由で
サーバーに情報をアップする便利なアイテムです。

こいつのもう1個の良さはこのサーバー上にある上記の情報を
API経由で取得出来る事。

この情報を活かして自分なりのダイエットアプリを作ったり
健康促進のゲーミフィケーションとかいろいろできそうです。

調べているとJava向けのラッパー「Fitbit4j」なるものが公開されていて
解説しているサイトがあったのでAndoirdからもいけるんじゃないかと
思ってさっそく下記のページの情報を参考に触ってみました

[ヅ] Fitbit API の Java ラッパー Fitbit4J を試してみる (2013-01-15) : http://www.nilab.info/z3/20130115_01.html

①準備

 Fitbit4Jを使う際に他のライブラリもいくつか必要になります。
 AndroidならJson周りとかはなんとかなりそうなもんだけど
 全部入れないととりあえず動かないし直す気も起きないのでそのままいきます。
 
 *Apache Commons Lang は3.3.xも出ていますが2.6じゃないと動きません。
 

  • Fitbit4J
  • Apache Commons Lang 2.6
  • Commons Logging 1.1.3
  • Joda Time Library 2.3
  • JSON Java Library
  • *JSON Java Libraryわかりにくいけどzipの中にjarありました

    上記の.jarを全部かき集めて放り込むところからスタートです。

    ②アプリの準備

     
    Fitbitの開発者用ページ(https://dev.fitbit.com/)でアプリの登録を行います。

    Application Name *
     アプリ名

    Description *
     アプリの説明

    Application Website *
     サイトURL Androidアプリでも必要なのでなんかいれとこう

    Organization *
     企業・団体名 個人でも必須

    Organization Website *
     上記のサイトURL

    Application Type *
    Desktop Browser
    今回はoAuth認証でPINコードを使わないでやりたいので
    Browserを選択。

    Callback URL
     いらない

    Default Access Type *
    Read & Write Read-Only
     アプリにあわせて

    ここまでやるとアプリの認証に必要な
    ・Consumer key
    ・Consumer secret
    が表示されるので次は実際に認証をしてみよう

    「認証編へ」

    Kii Cloudでさくっとデータベースを使用したAndroidアプリを作ろう。 データを扱う編

    さてユーザーのサインアップ>ログインまで実装しちゃったので
    今度は実際にそのユーザーに紐付けたデータをKii Cloudにあずけて見ましょう。

    その前に前回のログインの中で

    KiiUser user = KiiUser.logIn(username,password);
    string id = user.toURI();
    

    .toURI()を使うとユーザーの一意のIDが取れるので
    このへんの必要になりそうなものはちゃんとログイン時に別で持っておきましょう。

    あと必要に応じて Kii.initialize も忘れずに。

    *追記

    下記のコードの中で出てくる

    Kii.bucket("任意の文字列").object();

    はログインしていれば全てのユーザーから閲覧できるとのことで

    各ユーザが自身のデータしか参照しないようなものであれば

    KiiUser.getCurrentUser().bucket("任意の文字列")

    を使用してください

    他にもグループ(特定のユーザー)だけが特定の権限を持った処理を行える
    といったこともできるようなので公式リファレンスの
    「Bucket の ACL 設定」を確認しておくとよさそうです、

    データを保存する

    
    	//データ保存用のオブジェクト作成 任意の文字列はテーブル名みたいなものかな
    	KiiObject object = Kii.bucket("任意の文字列").object();
    
    	//.set("カラム名", "データ") という形で渡す
    	object.set("data1", "TEST_A");
    	object.set("data2", "TEST_B");
    	// Save the object
    	try {
    		object.save();
    	} catch (IOException e) {
    		// Handle error
    	} catch (AppException e) {
    		// Handle error
    	}
    
    
    

    データを参照する

    
    List<KiiObject> objLists = null;
    
    	try {
    
    		KiiBucket bucket = Kii.bucket("任意の文字列");
    
    		//今回は名前で検索(Select)
    		KiiQuery query = new KiiQuery(KiiClause.and(KiiClause.equals(
    		"username", "検索したい文字列")));
    
    		// データ(object)が作成された時間でソート
    		query.sortByDesc("_created");
    
    		KiiQueryResult<KiiObject> result = bucket.query(query);
    		objLists = result.getResult();
    
    	} catch (IOException e) {
    		// handle error
    	} catch (AppException e) {
    		// handle error
    	}
    
    
    //実際に取得したデータはfor文等でぶん回してtoURI()してあげると各データ一意のURIを取得できる。
    //データを更新する際や削除する際に必要になるのでちゃんと別途保存しておこう。
    for (KiiObject obj : objList){
    	//URIを取得
    	URI uri = obj.toURI();
    }
    
    
    

    実際には通信は別スレッドで受け取ったデータはUIに反映させるだろうから
    もう少し長くなるけど基本的にはこれだけ。

    データを更新する

    
    	//上の「データを参照する」で拾ったobjectには各データ固有のURIをtoURI();で
    	Uri objUri = Uri.parse("参照したデータから取得したURI");
    
    	//objectに更新したいデータをURIを渡して指定する
    	KiiObject object = KiiObject.createByUri(objUri);
    	
    	//更新も作成と大体同じ。当然カラム名が一致してないと更新できない
    	object.set("data1", "TEST_C");
    	object.set("data2", "TEST_D");
    
    	// Save the object
    	try {
    		object.saveAllFields(true);
    	} catch (IOException e) {
    		// Handle error
    		str = e.getMessage();
    	} catch (AppException e) {
    		// Handle error
    		str = e.getMessage();
    	}
    
    

    データを削除する

    
    	Uri objUri = Uri.parse("削除したいデータのURI");
    	KiiObject object = KiiObject.createByUri(objUri);
    
    	try {
    		object.delete();
    	} catch (AppException e) {
    		// handle error
    	} catch (IOException e) {
    		// handle error
    	}
    
    

    またもこれだけ。たったこれだけで
    SQLのSelect Insert Update Deleteが出来てしまう。

    なんて楽なんだ…

    Kii CloudでさくっとWebアプリを作ろう。 ログイン編

    Kii Cloudでサインアップが完了したら実際に認証を行ったアカウントで
    ログインしてみましょう。

    ソース的にはこちらも前回とほとんど差がありません。

    content-type:application/jsonになっているようにこちらは
    jsonで値が返って来ますので素直にjson_decodeで
    errorCode等を拾った方が分かりやすそうです。

    
    		//送信するデータをJsonにする
    		$hash = array(
    				"username" => $_POST["name"], 
    				"password" => $_POST["pass"]
    		);
    
    		//POSTするデータを設定
    		$param = json_encode($hash);
    
    		//今回はHeaderのみでURLにAPPKEYは不要みたい
    		$url = "https://api-jp.kii.com/api/oauth2/token";
    
    		//セッションの初期化
    		$ch = curl_init();
    
    		//リクエストを送るURL
    		curl_setopt( $ch, CURLOPT_URL, $url );
    
    		//ヘッダーの出力無し
    		curl_setopt( $ch, CURLOPT_HEADER, 0 );
    
    		//APPKEYとかぶち込む
    		curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    			'content-type:application/json',
    			'x-kii-appid: {APPID}',
    			'x-kii-appkey: {APPKEY}'
    		    ));
    
    		//POSTするデータ
    		curl_setopt( $ch, CURLOPT_POSTFIELDS, $param );
    
    		//結果を変数で受け取る
    		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    
    		//リクエスト送信
    		$res = curl_exec( $ch );
    
    		//とりあえず結果を見てみる
     		echo $res;
    
    		//セッションを終了
    		curl_close( $ch );
    
    

    Kii CloudでさくっとWebアプリを作ろう。 サインアップ編

    前回 Android(java)でCloudを利用したアプリ作成を行ったけど
    ブラウザからもデータを閲覧出来るようにしたい!と思って
    Kii CloudのREST APIを使ってみることにした。

    基本的には使い方はほとんど同じでサインアップなんかも
    さくっとやってくれる。

    レンタルサーバーのPHPでもlibcurlが動けば使えてしまうのでとても楽。

    サインアップは以下のとおり

    
    		//アカウント作成に必要な送信するデータを連想配列にする
    		$hash = array(
    				"emailAddress" => $_POST["emailAddress"], 
    				"loginName" => $_POST["loginName"], 
    				"password" => $_POST["password"], 
    				"country" => "JP");
    
    		//連想配列をJsonにしてPOSTするデータを設定
    		$param = json_encode($hash);
    
    		//{APPID}は各々自分のAPPIDを入力
    		//日本語リファレンスでも https://api.kii.com となっているけど
    		//日本のサーバー(https://api-jp.kii.com)にアクセスしないと404エラーが出るおそれがあるので注意
    
    		$url = "https://api-jp.kii.com/api/apps/{APPID}/users";
    
    		//セッションの初期化
    		$ch = curl_init();
    
    		//リクエストを送るURL
    		curl_setopt( $ch, CURLOPT_URL, $url );
    
    		//ヘッダーを出力 ここを0にしておけばJson形式で返ってくるので処理しよう。
    		curl_setopt( $ch, CURLOPT_HEADER, 1 );
    
    		//APPKEYとかぶち込む
    		curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    			'content-type:application/vnd.kii.RegistrationRequest+json',
    			'x-kii-appid: {APPID}',
    			'x-kii-appkey: {APPKEY}'
    		    ));
    
    		//POSTするデータ
    		curl_setopt( $ch, CURLOPT_POSTFIELDS, $param );
    
    		//結果を変数で受け取る
    		curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    
    		//リクエスト送信
    		$res = curl_exec( $ch );
    
    		//とりあえずヘッダー表示
    		echo $res;
    
    		//セッションを終了
    		curl_close( $ch );
    

    あとは返って来たヘッダーを見て201 Createとあれば正常にサインアップされているはず。

    Kii Cloudでさくっとデータベースを使用したAndroidアプリを作ろう。 ユーザー認証編

    クラウドクラウド言ってるけど
    実際サーバーサイド書くのめんどくさいよー!って嘆いてたら
    お世話になっている方にBaaS使えばいいじゃないって
    Kii Cloudというサービスを教えていただいた。

    BaaSってのは要するにモバイル関連サービスにありがちな機能を
    全部まとめて簡単に使えるようにしちゃったよ♪っていうものらしい。

    Kii Cloudは現在はBetaで無料(?)で使用出来る&日本語のドキュメントも用意されてたので
    ちょっとAndroidからいじってみた。

    今回作りたいアプリでKii Cloudで使える機能は

    ① アカウント作成
    ② サインイン
    ③ クライアントからデータをサーバーに送信
    ④ Web+Androidクライアントでサーバーからデータを取得・表示
    ⑤ PUSH通知

    結局全部できる。なんなのBaas。

    ①のアカウント作成と②のサインインをちゃちゃっと実装。

    ・まずはkii cloudに登録
    ・サインイン後にCreate Appで作りたいAppを作成
    ・Access KeysをクリックするとApp IDApp Keyが表示される

    実際にコードを書くのはここからで

    まずおまじないでkii cloudの初期化をする

    		Kii.initialize("APP_ID", "APP_KEY", Site.JP);
    

    App IDApp Key
    Access Keyで確認した自分のアプリの値を入力しておく

    ここからアカウント作成を実装

    今回はよくありがちなアカウント登録>メール認証を使ってみたかったので
     ・ユーザー名
     ・メールアドレス
     ・電話番号
    を入力させてメールでURLを送りつけてクリックしたら認証完了っていう流れをやってみた。

    やってみたといっても全て Kii Cloudに機能としてあるので
    Kii Cloudのサイトから自分のAppを選んで

    Edit > Settings > Require Verification の Mail Addressにチェックを入れて [Save]

    準備はこれだけ。

    書くコードは公式のリファレンスガイドより

    
    kiiUser.Bulider builder = KiiUser.builderWithName("user_123456"); 
    builder.withEmail("user_123456@example.com"); 
    //builder.withPhone("+819012345678"); //電話認証も出来るようです
    KiiUser user3 = builder.build(); 
    
    try { 
        user3.register("123ABC"); 
    } catch (AppException e) {
        // Sign-up failed for some reasons
        // Please check AppException to see what went wrong...
    } catch (IOException e) { 
        // Sign-up failed for some reasons
        // Please check IOExecption to see what went wrong...
    }
    

    たったこれだけ。

    kiiUser.Buliderに builderWithNameで ユーザーに入力してもらったユーザー名を入れて
    withEmailで同じようにメールアドレスを入れて
    kiiuserをbuildしてregisterする時にパスワードを渡すだけ。

    registerした瞬間に通信してるのでこのへんはAsyncTaskでやらないとAndroid側がエラー出す。

    あとはメールがポーンと届いてるのでURLクリックすると認証出来たよ的なことが表示される。

    既に登録されてたり問題があるときはjsonでエラーが返ってくるようなので別途パースしないといけないかな?

    まだちゃんと調べてないので後で追記します。

    サインイン

    これも数行

    String username = "user_123456";
    String password = "123ABC";
    try {
        KiiUser loginUser = KiiUser.logIn(username, password);
    } catch (IOException e) {
        // Sign-in failed for some reasons
        // Please check IOExecption to see what went wrong...
    } catch (AppException e) {
        // Sign-in failed for some reasons
        // Please check AppException to see what went wrong...
    }
    

    ユーザー名とパスワード入力させて

    KiiUser loginUser = KiiUser.logIn(username, password);

    これだけだよ…

    正常にログインできてたら KiiUserのmethodでいろいろ取得したり
    メールアドレス・パスワードの変更とか出来るようなので
    このへんも近いうちに書いてみる。

    なんともはやこれだけでアカウント作成>サインインが実装できてしまった。

    もうcakePHPなんて触らなくていいんだ!!

    私のようなクソグラマーでもこんなものが作れてしまうのだから
    恐ろしい世の中だ… Baas恐るべし。

    一応ソース残しておく。じゃじゃっと書いたので汚いのは許して。

    public class MainActivity extends Activity {
    
    	private static Task authTask;
    	private static LoginTask loginTask;
    	private static ProgressDialog mProgressDialog;
    
    	EditText txt_email;
    	EditText txt_password;
    	EditText txt_nickname;
    
    	EditText txt_login_email;
    	EditText txt_login_password;
    
    	Button b_make_account;
    	Button b_login;
    
    	String msg = "";
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    
    		Kii.initialize("APP_ID", "APP_KEY", Site.JP);
    
    		init();
    
    	}
    
    	private void showDialog() {
    		mProgressDialog = new ProgressDialog(this);
    		mProgressDialog.setMessage("通信中");
    		mProgressDialog.setIndeterminate(false);
    		mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
    		mProgressDialog.setCancelable(false);
    		mProgressDialog.show();
    	}
    
    	private void dismissDialog() {
    		mProgressDialog.dismiss();
    		mProgressDialog = null;
    	}
    
    	private void init() {
    
    		// 定義
    		txt_email = (EditText) findViewById(R.id.txt_email);
    		txt_password = (EditText) findViewById(R.id.txt_password);
    		txt_nickname = (EditText) findViewById(R.id.txt_nickname);
    
    		txt_login_password = (EditText) findViewById(R.id.txt_login_password);
    		txt_login_email = (EditText) findViewById(R.id.txt_login_email);
    
    		b_make_account = (Button) findViewById(R.id.b_make_account);
    		b_login = (Button) findViewById(R.id.b_login);
    
    		b_login.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    				if (txt_nickname.getText().toString().equals("")
    						|| txt_email.getText().toString().equals("")
    						|| txt_password.getText().toString().equals("")) {
    
    					Toast.makeText(getBaseContext(), "すべての項目を正しく入力してください",
    							Toast.LENGTH_SHORT).show();
    
    				} else {
    
    					postLoginDetail post_login_detail = new postLoginDetail();
    					post_login_detail.setParams(txt_login_email.getText()
    							.toString(), txt_password.getText().toString());
    
    					showDialog(); // プログレスダイアログの再表示
    					loginTask = new LoginTask();
    					loginTask.execute(post_login_detail);
    
    				}
    
    			}
    
    		});
    
    		// イベント処理
    		b_make_account.setOnClickListener(new View.OnClickListener() {
    			@Override
    			public void onClick(View v) {
    
    				String ptnStr = "[\\w\\.\\-]+@(?:[\\w\\-]+\\.)+[\\w\\-]+";
    				Pattern ptn = Pattern.compile(ptnStr);
    				String mail = txt_email.getText().toString();
    				Matcher mc = ptn.matcher(mail);
    
    				if (txt_nickname.getText().toString().equals("")
    						|| txt_email.getText().toString().equals("")
    						|| txt_password.getText().toString().equals("")
    						|| !mc.matches()) {
    
    					Toast.makeText(getBaseContext(), "すべての項目を正しく入力してください",
    							Toast.LENGTH_SHORT).show();
    
    				} else {
    
    					postMakeAccount pma = new postMakeAccount();
    					pma.setParams(txt_nickname.getText().toString(), txt_email
    							.getText().toString(), txt_password.getText()
    							.toString());
    
    					showDialog(); // プログレスダイアログの再表示
    					authTask = new Task();
    					authTask.execute(pma);
    
    				}
    
    			}
    		});
    
    	}
    
    	/**
    	 * Task バックグラウンド処理用のクラス
    	 */
    	protected class LoginTask extends
    			AsyncTask<postLoginDetail, String, String> {
    
    		@Override
    		protected String doInBackground(postLoginDetail... params) {
    			String str = "";
    
    			str = login(params[0]);
    
    			return str;
    		}
    
    		/**
    		 * onPostExecute
    		 * 
    		 * @param String
    		 *            result 通信結果 結果を受け取ったときに・・・メインスレッド
    		 */
    		@Override
    		protected void onPostExecute(String result) {
    			dismissDialog();
    			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
    		}
    	}
    
    	/**
    	 * Task バックグラウンド処理用のクラス
    	 */
    	protected class Task extends AsyncTask<postMakeAccount, String, String> {
    
    		@Override
    		protected String doInBackground(postMakeAccount... params) {
    			String str = "";
    
    			str = makeAccount(params[0]);
    
    			return str;
    		}
    
    		/**
    		 * onPostExecute
    		 * 
    		 * @param String
    		 *            result 通信結果 結果を受け取ったときに・・・メインスレッド
    		 */
    		@Override
    		protected void onPostExecute(String result) {
    			dismissDialog();
    			Toast.makeText(getBaseContext(), result, Toast.LENGTH_SHORT).show();
    		}
    	}
    
    	class postLoginDetail {
    
    		String nickname = "";
    		String password = "";
    
    		void setParams(String n, String p) {
    			nickname = n;
    			password = p;
    		}
    
    		String getNickname() {
    			return nickname;
    		}
    
    		String getPassword() {
    			return password;
    		}
    
    	}
    
    	class postMakeAccount {
    
    		String nickname = "";
    		String email = "";
    		String password = "";
    
    		void setParams(String n, String m, String p) {
    			nickname = n;
    			email = m;
    			password = p;
    		}
    
    		String getNickname() {
    			return nickname;
    		}
    
    		String getEmail() {
    			return email;
    		}
    
    		String getPassword() {
    			return password;
    		}
    
    	}
    
    	private String login(postLoginDetail params) {
    
    		String msg = "";
    
    		String username = params.getNickname();
    		String password = params.getPassword();
    
    		try {
    			KiiUser loginUser = KiiUser.logIn(username, password);
    
    		} catch (IOException e) {
    			// Sign-in failed for some reasons
    			// Please check IOExecption to see what went wrong...
    			msg = e.getMessage();
    
    		} catch (AppException e) {
    			// Sign-in failed for some reasons
    			// Please check AppException to see what went wrong...
    			msg = e.getMessage();
    
    		}
    
    		return msg;
    	}
    
    	private String makeAccount(postMakeAccount pma) {
    
    		String msg = "";
    
    		KiiUser.Builder builder = KiiUser.builderWithName(pma.getNickname());
    		builder.withEmail(pma.getEmail());
    		KiiUser user = builder.build();
    
    		try {
    			user.register(pma.getPassword());
    			msg = "メールを確認しURLをクリックして認証を完了してください";
    		} catch (AppException e) {
    			msg = e.getMessage();
    		} catch (IOException e) {
    			msg = e.getMessage();
    		}
    
    		return msg;
    	}
    
    }
    
    
    

    HTC One X root取得後の諸問題とCID & RUUの適用に関して

    HTC One X root取得後の諸問題とCID & RUUの適用に関して
    先日One Xのアンロックとroot取得後幾つか問題が発生していたので
    報告と対処をググった内容をメモがてら載せておきます。
    *前置きとしてまだCIDはNONEですがRUUは当てられるようです
    ①OTA当てられない or 当てた後まともに動かない
    標準ROMでroot化後にOTAが降ってきます。
    更新しろと言われるのですがまずまともに適用できません。
    リカバリからroot化前にリストアして無理やり適用すると
    なんとかあたるのですが今度は動画再生時や
    スクリーンショット撮影時恐らく音が出るタイミングでリブートします。
    これ正直使い物になりません。

    これはもうカスタムロムを使うか後述のRUUを当てて初期化するか
    古いバージョンのまま使うしか無いです。
    ただカスタムROMでもリブートの問題は出ているようですね…
    *症状個体差あり?
    ②OTA無理やり当てるとCWM Touch Recoveryちゃんと起動しない
    正直これはビビリましたがさくっと治りました
    ドロイド君が一瞬表示されてリカバリがリブートされてしまって
    リストアすらできない!RUUも当てられないんじゃないの!と…

    完全に死んだわけではなさそうだったのでリカバリ焼きなおそうと
    再度CWMをfastboot flash recoveryで流し込みましたが
    症状改善せず。恐らく無理やりOTA焼いた時に変な情報が
    残っちゃったんだろうなと…

    Wikiを見る感じ「fastboot erase cache」でキャッシュ消せば治るようです。
    が厄介なことに治りませんでした…
    こっから先は個体差あるようなので最終手段で
    [TOOL] HTC One X All-In-One Toolkit V1.0 [4-17-12] [PERM ROOT][Noob-Proof] – xda-developers
    結局リカバリなんかをワンクリックで焼けるOneX用の上のツールをダウンロードして
    右上のNext flash a Recovery > stockを選んであげたら
    初期リカバリに戻されることなくCWM touchが起動しました。
    恐らく2回やれば初期リカバリに戻ると思います。が試してません。
    ③RUU当てて初期化する
    これが一番困りました。結局今のところRUUを当てるには
    HTC devの公式unlockしたものをrelockするのが手っ取り早いようです。
    ただそれでもCIDがNONEであることには変わりませんが
    ちゃんとRUU焼けてるしいいかな。
    *他の国やキャリアのRUUは試してませんので文鎮化してもしらねす
    unlock時に表示されていましたがrelockはfastbootに入って
    「fastboot oem lock」と打つだけです
    場合によっては「fastboot clear cache」してあげたほうがいいようです。
    そのあとは下からお好きなRUUをダウンロードして実行してあげてください。
    [ROM]Endeavor Shipped ROM Collection
    [TOOL][30/04] Automated Fastboot Commands For HTC One X – V1.2 – xda-developers
    *fastboot周りのコマンド入力手助けしてくれるツールみたいです
    これぐらいは頭に入れておきたいところですが…

    Categories: HTC

    HTC One X購入 & root化 ついでにフォント変更俺zip

    HTC One X購入 & root化 ついでにフォント変更俺zip.

    先日ようやく HTC One X 到着しました。
    Galaxy Nexusに慣れていたのでサイズは許容範囲内です。
    普通の4インチ以下から持ち変えるととんでもなくでかく感じますね…
    とりあえずベンチマークも動画で残してみました

    そんなことはどうでもよくてあいも変わらず中華フォントなんです。
    *毎度の事ですが以下は端末の保証もなくなるし文鎮の恐れもあるので自己責任で
    *あとTwitterで教えてもらったのですが現在下記の方法でやると
    CIDがNoneになる可能性があります。
    下手するとRUUが当てられないかも…
    復旧方法がリカバリぐらいしかなくなるしいろいろハイリスクなので
    もう少し様子見でもいいかも。
    先生の時と同じように”fastboot oem writecid 11111111″をすると
    FAILED (status read failed (Too many links))
    が帰ってきてしまいました…

    今のところ手段は無いですがまぁXDAの盛り上がり見てれば対処されるでしょう。
    あとOne Xバッテリー抜けないから一切応答なくなった時の再起動は
    電源+音量両方同時押しで。
    まず公式bootloaderロック解除とroot化はこちら
    One Xのroot取得 – doggisma
    頻繁にロム焼きするかわかりませんが
    s-offされてないからadb shellからちまちまやらなきゃいけないし
    めんどくさいのでフォント変更用のzip置いておきます。
    (拾い物のフォントなので権利関係問題あったら言ってください。)
    *と思ったら起動中にESファイルエクスプローラで
    普通にフォント上書きできちゃいました。S-OFFとは何だったのか。
    ということであまり意味のない俺zipです…

    Clockworkmod recoveryから焼くだけです。
    見にくいぞこのフォントって人はまぁ入れ替えて好きにしてください。
    フォント変更用zipはこちら
    では。

    Categories: HTC