2013年8月22日木曜日

?でsplit Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0 ?

Exception in thread "main" java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0
?

"?" (はてな、クエッション)
でsplitをしようとしたら、このようなエラーがでました。

"http://XXXXXX.com/AAAAAAA/CCCCC/?page=2&mode=max&rtn_urk=http://XX&version=1.0"

こんなURLのパラメータだけを取得しようとして、失敗!!

とりあえず、splitから方向転換して、

String sUrl   = "http://XXXXXX.com/AAAAAAA/CCCCC/?page=2&mode=max&rtn_urk=http://XX&version=1.0";
String sParam = sUrl.substring( sUrl.indexOf("?") + 1);
System.out.println("パラメーター:" + sParam);
こんな感じにすると成功!!

出力結果
パラメーター:page=2&mode=max&rtn_urk=http://XX&version=1.0

splitはだめでしたが、indexOfは?を認識したようです。
なぜ??

このままでもいいんですが、何となくsplitできる方法をさがしたところ。。。


String[] sList = sUrl.split("\\?");

このようにエスケープ文字を2つ入れるとOKでした。

?がエスケープ文字とは知らなかったです。。。

2013年8月20日火曜日

エラー(java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10030 nor current process has android.permission.READ_PHONE_STATE)

java.lang.RuntimeException: Unable to start activity ComponentInfo{パッケージ名/パッケージ名.起動クラス名}: java.lang.SecurityException: Requires READ_PHONE_STATE: Neither user 10030 nor current process has android.permission.READ_PHONE_STATE.

こんなエラーが出てしまった。。。

何だと、思いながらも、何となくわかってしまった!!

原因は

manifest.xmlのパーミッションの付け忘れだ!!

パーミッションがないのに、端末情報を参照しようとしたら、怒らたンゴ

<uses-permission android:name="android.permission.READ_PHONE_STATE"/>

↑これを追加したら、ちゃんと動きました。。


文字列(String型)

AndroidというよりJAVAよりな事ですが、
文字列を扱う各関数について、よく使うのを
紹介します。

■生成
String str = "Hello, World";

new はなくても生成できます

■文字長さ取得
int型 str.length();
かっこの中に何を入れるかはわかりませんが、
こんな使い方。
注意点は全角でも1文字と判定されることです。

■文字列が同じかの判定
boolean型  str.equals("判定文字");

=とか==とか===では同じ文字列かの判定はできません

ex)
if ( !str.eqquals("ok") ){
}
//文字列がokではないことを判定しています。


■指定した文字列から始まっているかの判定
boolean型 str.startsWith("判定文字列")


■指定した文字列の現れる位置を取得
int型 str.indexOf("判定文字列");

存在しない場合には,-1を返します。。


■型を変更させる
●文字列型から、数値型
Integer.valueOf("1245");

●数値型から、文字列型
String.valueOf(123556);

2013年8月10日土曜日

JSON( JSONObject, rootObject)

Androidアプリで、WEB通信の返し値をさばきたいときありますよね??

WEBAPIでよく使われる返し値はたいていJSON型なので、
JSONをパースしてみようと思います。

◆JSONオブジェクトの生成

JSONObject 変数名 = new JSONObject(文字列);

このように渡せば文字列がJSON型で返されます。

◆サンプルソース

{"result":"true","item_list":{"item_1":"apple","item_2":"banana","item_3":"melon"}}
こんなJSONがWEBAPIで返ってくるというていでお願いいたします。

package com.page.sss;

import org.json.JSONException;
import org.json.JSONObject;

import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.app.Activity;

public class MainActivity extends Activity {

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

        //基礎画面の作成
        LinearLayout oLayout = new LinearLayout(getApplicationContext());
        oLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(oLayout); 
        
                
        //postデータを作成

            ~~~~~~
     ~~~~~~

        //WEBAPIにPOST時の返し値を取得
        String sRet = post(sUrl);
        //テキストビューに出力
        oLayout.addView(Make_TextView("返し値:" + sRet));
        
        try {
            //文字列をJSONオブジェクトに変換
            JSONObject rootObject = new JSONObject(sRet);

            //キーから、アイテムを取得する
            JSONObject itemobject = (JSONObject)rootObject.get("item_list");
            //JSONオブジェクト型から、文字列に変換
            String sKekka = itemobject.toString();
            //テキストビューに出力
            oLayout.addView(Make_TextView("1階層掘り下げ:" + sKekka) );
            //テキストビューに出力
            oLayout.addView(Make_TextView("一番奥の情報:" + itemobject.get("item_2").toString()) );
        } catch (JSONException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }
    }
    
    private TextView Make_TextView(String sText){
        TextView oTv = new TextView(getApplicationContext());
        oTv.setText(sText);
        return oTv;
    }
    
}
◆実行結果
こんな、感じで無事に文字列を取得できました!! JSONObject itemobject = (JSONObject)rootObject.get("item_list"); この部分はもっと上手く作る方法もあるかと思うんですが、どうなんだろう。。。。 個人的にはPHPのように簡単に連想配列にできるわけでもなく、JSONって結構面倒 とか思っているのですが、とりあえずできてよかったです。