2011年4月9日土曜日
Androidマーケットへの登録
スムースに動作するコンパスアプリが欲しかったので、自分で作ってマーケットに登録してみました。
GLSurfaceView(openGL)を用いてスムースな動作を目指してます。トレードオフとして、起動が少し遅いですが…
もし興味のある方はこちらからどうぞ。
※あくまで個人製作ですので、要望やバグ報告はマーケットに登録してあるメールアドレスからお願いします
登録の際、少しはまったところを挙げておくと…
■マーケットに表示されるアプリアイコンがデフォルトのまま
これは、リソースのdrawable-hdpiにのみアプリアイコンを入れていて、他のdrawable-mdpiとdrawable-ldpiにはデフォルトアイコンが入っていた事が原因でした。
■IS03で画像(テクスチャ)が表示されない
drawable関連でもう一つ。
IS03は特殊な解像度なので、drawable-320dpiというリソースフォルダを作成し、その中に対応する画像を入れる必要があります。SDK2.3からはdrawable-xdpiというリソースフォルダが使用できるようです。
■全年齢対象に出来ない
はまったところではありませんが、現在地を取得するアプリは全年齢対象アプリに出来ないようです。
今回、コンパスの真北を取得するために現在地の取得を行っているので、それが原因でした。
さて、Googleにデベロッパーとして登録するとデベロッパーコンソールというページが使えるようになるのですが、これが凄く便利です。
■統計情報の表示
さすがGoogleといった感じで、インストールされたプラットフォーム、端末、有効なインストール数、国等の情報をグラフ表示してくれます。
■詳細なバグレポート
一番驚いたのはここ。
アプリごとのエラーレポートを見る事が出来、その中ではエラーの発生時間、種類はもちろんのこと、なんとどのクラスの何行目でエラーが起こっているかも見る事が出来ます。開発時にLogCatでログ見ているとエラーが起きた時に内容が表示されますが、その内容がそのままデベロッパーコンソールで見る事が出来るイメージです。
開発者には嬉しい仕様ですね。
これだけ充実していると、また何か作りたくなってきてしまいますね。
EclipseにAndroid SDKのサンプルを読み込んで、警告を消す
Android SDKにはGoogle製のサンプルがいくつもついてきます。
Androidアプリを開発する時にはEclipseを使う事が多いと思いますが、Eclipseにそのサンプルを読み込む方法と、そのままでは警告が出てしまいますので、それらを消す方法をご紹介します。
まず、新規プロジェクトを作成し、Androidプロジェクトを選択します。
ここで、普通であればパッケージやアプリ名等を入力して新規プロジェクトを作成しますが、「既存サンプルからプロジェクトを作成」から、インポートしたいサンプルを選択します。ただし、この項目はビルドターゲットを先に指定しておかないとアクティブにならないので、先に指定しておきます。
あとは、完了を押すとEclipseにサンプルプロジェクトがインポートされます。
さて、そのままでも問題なくビルドして端末にインストールできるのですが、上のキャプチャのように警告が大量に出てきます。
Eclipseはデフォルトではプロジェクトを横断して警告を表示してくるので、他のプロジェクトを進めているときでもこの警告が表示され、自分のプロジェクトでの警告やエラーがそれらに埋もれてしまいます。
ここでは、下記2つの対策を紹介します。
■選択プロジェクト上のエラー/警告のみ表示する
項目名通り、選択しているプロジェクトのエラー/警告のみが表示されます。
警告が表示される「問題」タブの右上、▼マークをクリックし、上の画像のように「表示」->「プロジェクト上のエラー/警告」を選択します。
■プロジェクト単位でエラー/警告を無視する
こちらの方法では、サンプルプロジェクトのエラー/警告のみを無効にします。
読み込んだプロジェクトのプロパティを開き、「Javaコンパイラ」->「エラー/警告」を選択します。
「プロジェクト固有の設定を可能にする」にチェックを入れ、必要な項目を「無視」に変えていき、OKを押すとプロジェクトのビルド後に変更が適用されます。
Google製のコードですし、コピペはあっても基本的にはソースを直接変更する事は無いと思いますので、全部無視で良いと思います。
サンプルの中では、ApiDemoが便利ですね。簡単にですが、何ができるか知る事が出来ます。
サンプルプロジェクトも結構多いので全部を網羅するのは大変そうですが、ちょくちょくのぞいてみると面白いかもしれませんね。
Androidアプリを開発する時にはEclipseを使う事が多いと思いますが、Eclipseにそのサンプルを読み込む方法と、そのままでは警告が出てしまいますので、それらを消す方法をご紹介します。
まず、新規プロジェクトを作成し、Androidプロジェクトを選択します。
ここで、普通であればパッケージやアプリ名等を入力して新規プロジェクトを作成しますが、「既存サンプルからプロジェクトを作成」から、インポートしたいサンプルを選択します。ただし、この項目はビルドターゲットを先に指定しておかないとアクティブにならないので、先に指定しておきます。
あとは、完了を押すとEclipseにサンプルプロジェクトがインポートされます。
さて、そのままでも問題なくビルドして端末にインストールできるのですが、上のキャプチャのように警告が大量に出てきます。
Eclipseはデフォルトではプロジェクトを横断して警告を表示してくるので、他のプロジェクトを進めているときでもこの警告が表示され、自分のプロジェクトでの警告やエラーがそれらに埋もれてしまいます。
ここでは、下記2つの対策を紹介します。
■選択プロジェクト上のエラー/警告のみ表示する
項目名通り、選択しているプロジェクトのエラー/警告のみが表示されます。
警告が表示される「問題」タブの右上、▼マークをクリックし、上の画像のように「表示」->「プロジェクト上のエラー/警告」を選択します。
■プロジェクト単位でエラー/警告を無視する
こちらの方法では、サンプルプロジェクトのエラー/警告のみを無効にします。
読み込んだプロジェクトのプロパティを開き、「Javaコンパイラ」->「エラー/警告」を選択します。
「プロジェクト固有の設定を可能にする」にチェックを入れ、必要な項目を「無視」に変えていき、OKを押すとプロジェクトのビルド後に変更が適用されます。
Google製のコードですし、コピペはあっても基本的にはソースを直接変更する事は無いと思いますので、全部無視で良いと思います。
サンプルの中では、ApiDemoが便利ですね。簡単にですが、何ができるか知る事が出来ます。
サンプルプロジェクトも結構多いので全部を網羅するのは大変そうですが、ちょくちょくのぞいてみると面白いかもしれませんね。
Androidでセンサーから方位を取得する
最近ネイティブAndroidプログラムに手を出しています。
FlashのAS3を触っていると、AndroidのJavaはあまり敷居が高くなく感じますね。whileの挙動とか、イベントリスナの登録あたりはちょっと違いますけど。
イベントリスナの登録は、AS3でいうNetStraemのonMetaDataハンドラの扱いに似ていますね。ただ、Javaの方はインターフェイスで強制実装させるあたり、厳格になっています。
さて、本題ですが、Androidでコンパスを作成する時の話です。
コンパスを作成するにあたってセンサの値を取ってくる必要があるのですが、他のセンサーと同じようにSensorManagerから読み出す事で使用する事が可能です。
Sensor.TYPE_ORIENTATIONが方位センサのタイプ定数になります。
ただ、このタイプは現在非推奨となっており、Android2.2からはSensorManager.getOrientation()が推奨されます。使い方としては、上記の方法で加速度と地磁気センサの値を取得し、それらの値から然るべき方位を計算する、という形になります。
ただ、このまま実装すると、リファレンスにもある通り特定の状態でしか正しい方位を取得できません。
画面が自分から見て手前側に傾いている時は正しく方位が見えますが、向こう側に傾いている時は方位が反転してしまいます。これを調整するにはremapCoordinateSystemの第二、第三引数を調整すると良いのですが、例えば横向きにする時には
とすれば良いようです。
これを、端末の向きによらず正しい方位を取得するようにしたかったので、色々試してみた結果
remapCoordinateSystem(inR, AXIS_X, AXIS_Y, outR);
を使用すると端末の向きによらず正しい方位を取得する事が出来ました。
ただし、iPhoneでもそうですが、寝転がってコンパスを見ると正しい方位が表示されません。まぁ、そんなことをする人はあまりいないと思いますが…
FlashのAS3を触っていると、AndroidのJavaはあまり敷居が高くなく感じますね。whileの挙動とか、イベントリスナの登録あたりはちょっと違いますけど。
イベントリスナの登録は、AS3でいうNetStraemのonMetaDataハンドラの扱いに似ていますね。ただ、Javaの方はインターフェイスで強制実装させるあたり、厳格になっています。
さて、本題ですが、Androidでコンパスを作成する時の話です。
コンパスを作成するにあたってセンサの値を取ってくる必要があるのですが、他のセンサーと同じようにSensorManagerから読み出す事で使用する事が可能です。
public class Compass extends Activity implements SensorEventListener{
private SensorManager sm;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sm=(SensorManager)getSystemService(SENSOR_SERVICE);
}
@Override
protected void onResume() {
super.onResume();
//全センサを取得
//List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ALL);
//加速度センサ
//List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ACCELEROMETER);
//磁気センサ
//List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);
//方位センサ
List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ORIENTATION);
for(Sensor sensor : sensors){
//イベントを登録
sm.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);
}
}
…
}
Sensor.TYPE_ORIENTATIONが方位センサのタイプ定数になります。
ただ、このタイプは現在非推奨となっており、Android2.2からはSensorManager.getOrientation()が推奨されます。使い方としては、上記の方法で加速度と地磁気センサの値を取得し、それらの値から然るべき方位を計算する、という形になります。
//SensorEventListenerにより実装が要求されるメソッド
public void onSensorChanged(SensorEvent event) {
float[] amv=new float[3];
float[] mfv=new float[3];
float[] orv=new float[3];
switch(event.sensor.getType()){
case Sensor.TYPE_ACCELEROMETER:
amv=event.values.clone();
break;
case Sensor.TYPE_MAGNETIC_FIELD:
mfv=event.values.clone();
break;
}
float[] in_r=new float[16];
float[] out_r=new float[16];
if(amv!=null && mfv!=null){
SensorManager.getRotationMatrix(in_r, null, amv, mfv);
SensorManager.remapCoordinateSystem(in_r, SensorManager.AXIS_X, SensorManager.AXIS_Z, out_r);
SensorManager.getOrientation(out_r, orv);
Log.d("message", String.valueOf(orv[0]));
Log.d("message", String.valueOf(orv[1]));
Log.d("message", String.valueOf(orv[2]));
}
}
ただ、このまま実装すると、リファレンスにもある通り特定の状態でしか正しい方位を取得できません。
Using the camera (Y axis along the camera's axis) for an augmented reality application where the rotation angles are needed:
remapCoordinateSystem(inR, AXIS_X, AXIS_Z, outR);
画面が自分から見て手前側に傾いている時は正しく方位が見えますが、向こう側に傾いている時は方位が反転してしまいます。これを調整するにはremapCoordinateSystemの第二、第三引数を調整すると良いのですが、例えば横向きにする時には
Using the device as a mechanical compass when rotation is Surface.ROTATION_90:
remapCoordinateSystem(inR, AXIS_Y, AXIS_MINUS_X, outR);
とすれば良いようです。
これを、端末の向きによらず正しい方位を取得するようにしたかったので、色々試してみた結果
remapCoordinateSystem(inR, AXIS_X, AXIS_Y, outR);
を使用すると端末の向きによらず正しい方位を取得する事が出来ました。
ただし、iPhoneでもそうですが、寝転がってコンパスを見ると正しい方位が表示されません。まぁ、そんなことをする人はあまりいないと思いますが…
2011年2月8日火曜日
Mac OS 10.6とiPhotoとAndroid
以前、iPhotoでAndroidの撮影した写真が読み込めないという記事を書きましたが、この症状に陥る条件が分かったので投稿しておきます。
症状をおさらいをすると、
・写真ファイルの文字数が8文字ジャスト
・ファイル名に"."や"-"を含まない
上記以外のファイルは、端末をつないでもiPhotoの読み込み候補に表示されません。なので、Androidの写真ファイル名(2010-10-28 13.01.25.jpg等)はアウト。ただ、端末によっては問題なく読み込めていました。また、写真を手動で(D&D等で)読み込む分には問題ありません。
色々と調べてみた結果、どうやらMac OS 10.6上のiPhotoでは、どのバージョンでも読み込む事が出来ないようです。ですので、写真の取り込みには他のソフトを使うなり、手動でなんとかするなりするしか無さそう…
確かに、他のカメラメーカーを見てもファイル命名規則は上記に乗っ取っているので、「カメラから写真を読み込む」にはこの条件でも良いですね。色々なデバイスがMacにつながれるようになった時、写真を選り分ける確実な方法、という事なのでしょう。
ただ、それ以外なら例えExif情報があろうと無視なのはちょっと困りますね…
Androidの写真をMacに読み込む、何か他の良い方法を探してみる事にします。
症状をおさらいをすると、
・写真ファイルの文字数が8文字ジャスト
・ファイル名に"."や"-"を含まない
上記以外のファイルは、端末をつないでもiPhotoの読み込み候補に表示されません。なので、Androidの写真ファイル名(2010-10-28 13.01.25.jpg等)はアウト。ただ、端末によっては問題なく読み込めていました。また、写真を手動で(D&D等で)読み込む分には問題ありません。
色々と調べてみた結果、どうやらMac OS 10.6上のiPhotoでは、どのバージョンでも読み込む事が出来ないようです。ですので、写真の取り込みには他のソフトを使うなり、手動でなんとかするなりするしか無さそう…
確かに、他のカメラメーカーを見てもファイル命名規則は上記に乗っ取っているので、「カメラから写真を読み込む」にはこの条件でも良いですね。色々なデバイスがMacにつながれるようになった時、写真を選り分ける確実な方法、という事なのでしょう。
ただ、それ以外なら例えExif情報があろうと無視なのはちょっと困りますね…
Androidの写真をMacに読み込む、何か他の良い方法を探してみる事にします。
2010年12月20日月曜日
Android(Galaxy Sのみ)でどの画面からでも画面の明るさを変更する方法 (追記あり)
何となく携帯(Galaxy S)をいじっていたら、設定等開かずに画面の明るさを変更する方法を発見したのでご紹介します。

Androidにはウィジェットがあるので、Galaxy Sであれば「消費電力の調整」というウィジェットを配置すればホーム画面から直接画面の変更する事が可能です。
画像の右端のアイコンがそうで、off(ユーザー設定のまま)、on(明るさ中)、on(明るさ大)、autoが順番に切り替わります。
ただ、この方法だといちいちホームに戻って来なければいけません。設定まで行かなくて済む、という点では便利ですが…

しかし、実はステータスバーを操作する事でどの画面からでも画面の輝度を変更可能です。操作方法は
1.ステータスバーを長押し
2.通知領域が消えたら左右にドラッグ
です。

明るさは絶対値指定のようで、ステータスバーの左側に行くほど暗くなり、右側に行くほど明るくなります。
今までも、何もしていないのに何故か突然画面の明るさが変わってしまうことがあって不思議に思っていたのですが、恐らくこの操作を行っていたのでしょう。
説明書に書いてあるのかもしれませんが、買ってから一切読んでいないので見落としていたのかも…
2011/1/6追記
店頭で試した所、どうやらこのワザはGalaxy Sでしか使えないようです。
Galaxy S / Xperia / HTC Desire HD / IS03で確認しましたが、Galaxy Sでのみ動作しました。
2011/1/10追記
ヨドバシとドコモショップにて店頭に展示してある複数の端末(4台)で試した所、Galaxy Sでも使える物と使えない物があるようです…
ヨドバシにあった3台中2台、ドコモにあった1台では成功しました。
OSのバージョン等見てみたが、どれも一緒でした。ただ、使えなかった端末は通知領域の「Bluetooth」の文字が入りきっておらず、最後の「h」が改行されていました。

使えなかった端末は今回触った端末の中で1つだけだったので要確認ですが、この表示と挙動の違いに因果関係があるかは不明です…
2011/1/10追記2
このブログを見てくれた友達が、自分の端末では出来なくて、Bluetoothの文字も全部入ってると教えてくれました。
ちょっと思い当たる所を探してみたのですが、「自動明るさ調整」が有効になっているとこのワザは無効になってしまうようです。なので、上の画像は見当違いな事言ってます(笑)でもまぁ、現に店頭でそういう端末個体差があったので、画像はこのままにしておきます。
自動調整とは共存できないですが、バッテリーの節約のため手動で!という方は
「設定」->「画面設定」->「明るさ」->「自動明るさ調整」のチェック
を外す事でこのワザが使えるようになります。

Androidにはウィジェットがあるので、Galaxy Sであれば「消費電力の調整」というウィジェットを配置すればホーム画面から直接画面の変更する事が可能です。
画像の右端のアイコンがそうで、off(ユーザー設定のまま)、on(明るさ中)、on(明るさ大)、autoが順番に切り替わります。
ただ、この方法だといちいちホームに戻って来なければいけません。設定まで行かなくて済む、という点では便利ですが…

しかし、実はステータスバーを操作する事でどの画面からでも画面の輝度を変更可能です。操作方法は
1.ステータスバーを長押し
2.通知領域が消えたら左右にドラッグ
です。

明るさは絶対値指定のようで、ステータスバーの左側に行くほど暗くなり、右側に行くほど明るくなります。
今までも、何もしていないのに何故か突然画面の明るさが変わってしまうことがあって不思議に思っていたのですが、恐らくこの操作を行っていたのでしょう。
説明書に書いてあるのかもしれませんが、買ってから一切読んでいないので見落としていたのかも…
2011/1/6追記
店頭で試した所、どうやらこのワザはGalaxy Sでしか使えないようです。
Galaxy S / Xperia / HTC Desire HD / IS03で確認しましたが、Galaxy Sでのみ動作しました。
2011/1/10追記
ヨドバシとドコモショップにて店頭に展示してある複数の端末(4台)で試した所、Galaxy Sでも使える物と使えない物があるようです…
ヨドバシにあった3台中2台、ドコモにあった1台では成功しました。
OSのバージョン等見てみたが、どれも一緒でした。ただ、使えなかった端末は通知領域の「Bluetooth」の文字が入りきっておらず、最後の「h」が改行されていました。

使えなかった端末は今回触った端末の中で1つだけだったので要確認ですが、この表示と挙動の違いに因果関係があるかは不明です…
2011/1/10追記2
このブログを見てくれた友達が、自分の端末では出来なくて、Bluetoothの文字も全部入ってると教えてくれました。
ちょっと思い当たる所を探してみたのですが、「自動明るさ調整」が有効になっているとこのワザは無効になってしまうようです。なので、上の画像は見当違いな事言ってます(笑)でもまぁ、現に店頭でそういう端末個体差があったので、画像はこのままにしておきます。
自動調整とは共存できないですが、バッテリーの節約のため手動で!という方は
「設定」->「画面設定」->「明るさ」->「自動明るさ調整」のチェック
を外す事でこのワザが使えるようになります。
2010年12月5日日曜日
iPhotoとAndroid (調査中)
2011.2.8追記
以下の症状、陥る条件が分かりました。以下にまとめましたので、どうぞ。(解決にはなっていませんが…)
Mac OS 10.6とiPhotoとAndroid
Android(Galaxy S)の写真をiPhotoに読み込ませようと思ったのですが、なぜかiPhoto上に表示されません。先代のフューチャーフォンで使っていたSDカードをそのまま使用していて、そちらで撮影した写真も入っているのですが、そちらの写真は表示されます。
いずれもSDカード直下にある「DCIM」フォルダ内にファイルがあり、それぞれ「100ANDRO」「100SHARP」というフォルダに写真が入っています。
原因を色々調べてみた結果、どうやら画像ファイルの文字数とファイル名に含まれている文字に原因があるようです。
ファイル名を色々変更して何度か読み込み直してみた所、iPhotoは「ファイル名が8文字ジャスト」で「ファイル名に"."や"-"を含まない」画像ファイルのみ読み込むようです。先頭の文字は数字でもOKで、あまり調べてないですがとりあえずファイル名に"_"は使用できました。
ちなみにAndroid純正カメラだとファイル名は
「2010-10-28 13.01.25.jpg」
Vignetteでは
「2010-12-05-02-17-14-936.jpg」
Camera360では
「C360_2010-11-23 10-19-37.jpg」
…どれもアウト。
他に良いカメラアプリがあるのかもしれないですが、メジャーどころはこんな所でしょうか。
仕方ないので、写真管理にはiPhotoを使用しつつ、Androidの写真の取り込みにはPicasaを使用しています。
PicasaはiPhotoのライブラリを読み込んで独自UIで一覧できるようになる上、顔認識機能があって、さらにそれをGoogleコンタクトと同期し、Picasaから顔写真を登録する事ができるのが魅力ですね。写真整理ついでにGoogleコンタクトが充実するのはスバラシイ。しかもタダ。
ただ、この手順だとPicasaで取り込んだ後、D&DでiPhotoに取り込んで、それをさらにPicasaが読み込みにいくという手順になるので、大分回りくどいんですが…
iPhoto側でもストレージから写真だけをピックアップする必要があり、試行錯誤があってこういう制約になっているのだとは思いますが、もっとうまい方法で写真をピックアップしてくれると嬉しいですね。
現状では、Picasa等を経由するか、上記条件に当てはまるファイル名で出力するカメラアプリを探すのが良さそうです。
2010.12.9追記
…と思ったら、会社のMac(iLife 09)では全部表示されました…(家のMacは11、アップグレード前の08でも不具合を確認)
端末固有の不具合なのかな?それともOSの違い等に左右されるのか…少し探ってみたいと思います。
以下の症状、陥る条件が分かりました。以下にまとめましたので、どうぞ。(解決にはなっていませんが…)
Mac OS 10.6とiPhotoとAndroid
Android(Galaxy S)の写真をiPhotoに読み込ませようと思ったのですが、なぜかiPhoto上に表示されません。先代のフューチャーフォンで使っていたSDカードをそのまま使用していて、そちらで撮影した写真も入っているのですが、そちらの写真は表示されます。
いずれもSDカード直下にある「DCIM」フォルダ内にファイルがあり、それぞれ「100ANDRO」「100SHARP」というフォルダに写真が入っています。
原因を色々調べてみた結果、どうやら画像ファイルの文字数とファイル名に含まれている文字に原因があるようです。
ファイル名を色々変更して何度か読み込み直してみた所、iPhotoは「ファイル名が8文字ジャスト」で「ファイル名に"."や"-"を含まない」画像ファイルのみ読み込むようです。先頭の文字は数字でもOKで、あまり調べてないですがとりあえずファイル名に"_"は使用できました。
ちなみにAndroid純正カメラだとファイル名は
「2010-10-28 13.01.25.jpg」
Vignetteでは
「2010-12-05-02-17-14-936.jpg」
Camera360では
「C360_2010-11-23 10-19-37.jpg」
…どれもアウト。
他に良いカメラアプリがあるのかもしれないですが、メジャーどころはこんな所でしょうか。
仕方ないので、写真管理にはiPhotoを使用しつつ、Androidの写真の取り込みにはPicasaを使用しています。
PicasaはiPhotoのライブラリを読み込んで独自UIで一覧できるようになる上、顔認識機能があって、さらにそれをGoogleコンタクトと同期し、Picasaから顔写真を登録する事ができるのが魅力ですね。写真整理ついでにGoogleコンタクトが充実するのはスバラシイ。しかもタダ。
ただ、この手順だとPicasaで取り込んだ後、D&DでiPhotoに取り込んで、それをさらにPicasaが読み込みにいくという手順になるので、大分回りくどいんですが…
iPhoto側でもストレージから写真だけをピックアップする必要があり、試行錯誤があってこういう制約になっているのだとは思いますが、もっとうまい方法で写真をピックアップしてくれると嬉しいですね。
現状では、Picasa等を経由するか、上記条件に当てはまるファイル名で出力するカメラアプリを探すのが良さそうです。
2010.12.9追記
…と思ったら、会社のMac(iLife 09)では全部表示されました…(家のMacは11、アップグレード前の08でも不具合を確認)
端末固有の不具合なのかな?それともOSの違い等に左右されるのか…少し探ってみたいと思います。
登録:
投稿 (Atom)










