AndroidのGoogle Play Serviceを利用する位置情報API

2013年にAndroidの位置情報を取得するAPIが新しくなりました。
より精度がよく、より速やかに、よりバッテリー消費が少なく!!位置情報が取得できるようになりました。

新APIはGoogle Play Serviceライブラリを利用します。
Fused location providerと呼んでいる人もいるようですが、それは新APIの位置情報プロバイダがそのように呼ばれているだけで、一部の話です。

http://developer.android.com/google/play-services/location.html

Androidのディスプレイサイズがxhdpiなのかxxhdpiなのか

Android

Androidのディスプレイサイズがxhdpiなのかxxhdpiなのか

Androidアプリを作っていて、とてもめんどくさいのが多種なスクリーンサイズに対応することですね。

「あれ、この端末で見た目がおかしいよ?」という時、まずはその端末が下記のどの画面サイズのグループに該当するのか確かめるのが先です。

mdpi:160dpi
hdpi:240dpi
xhdpi:320dpi (Galaxy S3a)
xxhdpi:480dpi (HTC J butterfly)
xxxhdpi : 640dpi

というわけで、上記の画面密度グループを表示するサンプルコードです。

 WindowManager windowManager = getWindowManager();
 Display display = windowManager.getDefaultDisplay();
 DisplayMetrics displayMetrics = new DisplayMetrics();
 display.getMetrics(displayMetrics);
 Log.d(TAG, "ディスプレイの密度グループ"+displayMetrics.densityDpi);

HTC J butterflyって乃木坂46がCMしているんですね!(・∀・)

Androidアプリからnode.jsに接続するとFile Not Found Exception

Java
Android
node.js
Express

ちょっと解決まで時間がかかったので書いておきます。
Expressは最近触り始めたのであまり知識がありません。

Androidアプリから、node.js + expressのサーバーに通信して、結果を取得するAPIを作成していました。
が、AndroidアプリでURLに接続すると

 File Not Found Exception 

で接続できない。
ブラウザでは普通に接続できるんですけど。
Javaではあるある~ ですよね。
サーバーからは404が帰ってきます。

で、最初はexpressの方かな?と思いまして、下記のようにわざわざ

 res.status(200)

をつけてみました。

 router.get('/route_out', function(req, res, next) {
 	console.log("route_out");
 
  res.status(200).send('broadcasted');
 
 });

ですが、

 File Not Found Exception 

は依然としてそのまま…。

node.jsを走らせていると、コンソールに次のような表示が…。

 POST /broadcast/route_out 404 35.966 ms - 947

あれっ アプリからはGETではなくて、POSTで接続してるじゃん!
とアプリのコードをよく読むと

 @Override
 protected String doInBackground(String... params) {
 
 	String string = null;
 	HttpURLConnection urlConnection = null;
 

try {

 			
 		URL url = new URL(params[0]);
 		   
 		urlConnection = (HttpURLConnection) url.openConnection();
 	    	urlConnection.setDoOutput(true);
 	    	urlConnection.setChunkedStreamingMode(0);
 
 	    	InputStream in;
 		    
       		int status = urlConnection.getResponseCode();
 
                if (status != HttpURLConnection.HTTP_OK){
 		            
 	            	in = urlConnection.getErrorStream();
 	            	Log.e(TAG, "サーバーからのレスポンスエラー " + status);
 	            
 	            }else{
 		 
 	            	in = new BufferedInputStream(urlConnection.getInputStream());
        		string =convertInputStreamToString(in);
 		    	Log.d(TAG, string);
 		    		    
 	            }
                
 		} catch (IOException e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}finally {
 		    urlConnection.disconnect();
 		}
 
 		return string;
 }

となっていて、

 urlConnection.setDoOutput(true);
 urlConnection.setChunkedStreamingMode(0);

この二つがいらなかったですね(;^ω^)

この二つを消して、下記を加えたら解決しました!

 urlConnection.setRequestMethod("GET");

Androidアプリのパッケージ名を最速で変更

Android

Androidアプリを開発している時、稀に出てくるのがパッケージ名を変えるという問題です。
こんな作業している暇があったら素晴らしいアプリの開発に専念していただきたいものです。
そこで、最速でパッケージ名を変える方法を編み出しました!
(筆者は2回もパッケージ名を変えた経験があります。)

AndroidManifest.xmlのパッケージ名を修正

マニフェストファイルの変更する部分は以下です。

 <manifest
    package="パッケージ名">

srcがたくさんエラーが出ますが、私はそんなことに構ってられるほど小さい男ではありません。
「Package Explorer」の「gen」を見ると、新しいパッケージ名が表示されているはずです。

srcのパッケージ部分を変更したいパッケージ名に変更

「Package Explorer」のsrc以下にあるパッケージ名を変更しましょう。
パッケージを右クリックし、「Refactor」→「Rename」で変更することができます。
メインとなるパッケージ以外にもサブのパッケージがある場合は、「Rename subpackages」にもチェックを入れましょう。
大事の前の小事っていいますね!

gen以下の古いパッケージを削除しましょう

これでパッケージ名を変更することができましたね。

猿「非常に簡単でした。私でもできましたから。」

Apache Use LogLevel debug to get a backtrace.

Apache

Apache Use LogLevel debug to get a backtrace.

Apacheのログのレベルを変更すると、より詳細にログを取得することができます。

httpd.confに

 LogLevel debug

と書いておくとログレベルがdebugになります。