カテゴリ: PhoneGap
投稿者: terada
Phonegap Plaguin
https://svn.codespot.com/a/eclipselabs.org/mobile-web-development-with-phonegap/tags/r1.2.5/download

※ 最新版はこちらから確認してください。

Help > Install New Software からWork withの項目に上記を入力してEclipseのPhoneGap Pluginをインストールしようとしたところ、エラーが出てしまいました。
An error occurred while collecting items to be installed
session context was:(profile=epp.package.java, phase=org.eclipse.equinox.internal.p2.engine.phases.Collect, operand=, action=).
Problems downloading artifact: osgi.bundle,org.mozilla.javascript,1.7.2.v201005080400.
MD5 hash is not as expected. Expected: 8785860e8f2a2a43fe10dd8b9eb334b6 and found 7ab8a5d6da46b081c83bfc81e7c880e6.



MDS AppLaud には
JavaScript Development Tools
jQuery Mobile License
jslint4java
PhoneGap License
PhonegapForAndroid
の5項目が含まれていて、一番上のJSDTで問題が発生しているようだったので、その下の4つを1つずつ上から順番に(一度に4つだと何故か駄目でした)インストールして行くと、最終的にPluginのボタンがIDE上に表示されて、新規プロジェクトの作成もすることができました。

※ EclipseはIndigoで確認しました。Galileoでは上の方法でも駄目でした…。
カテゴリ: OTHERS
投稿者: terada
Titanium StudioはAptanaベースの(ということはEclipseベースなのですが)開発環境です。
ちょっと試してみようと思って、作成したアプリケーションを実機にインストールする方法が分かりにくかったのでメモしておきます。
いつも通りにデバッグ可能にしているAndroid端末を接続し、普通にRun(もしくはDebug)するとエミュレーターしか選択できません。おや?と思って、adb devicesとしてみてるとちゃんと認識されている。RunConfigurationとか調べてみたのですが、設定できず。おかしいなぁと思ったら、「App Exploler」というTitaniumのプロジェクト管理用のViewで、プロジェクトを選択して右クリックすると、コンテクストメニューの中に「Install to Android Device」というのがあり、これ選択してやると実機にインストールすることができました。



ただし、アプリは勝手に立ち上がらないので、コンソールに「Application installed. Launch from drawer on Home Screen」と出たら、自分でアプリケーションメニューを開いて、インストールされているアプリを起動しなくては行けません。(何気に面倒・・・)
それに、デバッグもできなさそうでした。ここのサイトによると、「Titanium Community – 無料 – iOSとAndroidに対応したTitanium mobile SDKと、Titanium Studioで、モバイルデバイスのデバッグを除く全ての機能が使えます。」とあるので、無理くりなんとかしようとしても駄目なのかな?
カテゴリ: Android SDK
投稿者: terada
覚え書きです。
AppWidgetを作成中、「Unable to launch app ... process is bad」というようなエラーが出て、AppWidgetProviderもServiceも起動しなくなってしまいました。マニフェストXMLを編集したりいろいろやってみましたが、「アプリを一旦削除 → 端末を再起動」で解決しました。
カテゴリ: Android SDK
投稿者: terada
ViewのonMeasure内でwidthやheightの実際の値を取得する方法のコピペ用覚え書きです。MeasureSpec.getSizeを使います。
@Override
protected void onMeasure(int widthMeasureSpec,int heightMeasureSpec)
{
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
}
カテゴリ: Android SDK
投稿者: terada
ボタンのセレクターXML、いつもどうやって書くのか忘れてしまうので覚え書きです。いろいろ指定の仕方はあるみたいですが、ものによっては思ったような動作しなかったで、自分用ってことで。

<?xml version="1.0" encoding="UTF-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

<!-- 通常 -->
<item
android:state_enabled="true"
android:state_window_focused="false"
android:drawable="@drawable/button_background_normal" />
<!-- 無効 -->
<item
android:state_enabled="false"
android:state_window_focused="false"
android:drawable="@drawable/button_background_disable" />
<!-- 押下 -->
<item
android:state_pressed="true"
android:drawable="@drawable/button_background_pressed" />
<!-- フォーカス -->
<item
android:state_focused="true"
android:state_enabled="true"
android:drawable="@drawable/button_background_focused" />
<!-- 通常 -->
<item
android:state_enabled="true"
android:drawable="@drawable/button_background_normal" />
<!-- 無効、フォーカス -->
<item
android:state_focused="true"
android:drawable="@drawable/button_background_disable_focused" />
</selector>


「btn_selector.xml」とかの名前にしてdrawableフォルダに格納。
a2sd(アプリをSDカードに保存可能にする機能)対応する方法ですが、ビルドまでに必要な手順は以下の2(3)ステップです。

・ビルドターゲットを2.2にする
・マニフェストファイルでinstallLocationを設定
<manifest 
xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"
... />

(↓2.2より以前のOSでも一応インストールできるようにしたい場合。ただし、a2sd以外のSDK8以降の機能は使わないように気をつける)
・android:minSdkVersionは8にせず、任意のバージョンに設定

ただし!!
そのアプリをマーケットで公開したい場合は、もう1つ注意点があります。

・マーケットのデベロッパーコンソールの「公開設定のオプション」で「コピー防止」をオフにする
コピー防止をオフに

コピー防止をオンのまま公開すると、インストールはできても「設定>アプリケーション>アプリケーションの管理」から「SDカードに移動」ボタンが無効のままで効果がありません!

Apps on SD Card: The Details
↑「Security and Performance Implications」のところを参照
カテゴリ: Eclipse
投稿者: terada
細かいチップスですが、下記のようにFind/Replaceボックスのoptionsの「Wrap search」のチェックボックスを有効にすると、FIndボタンを連続でクリックして検索のインデックスが終点(もしくは始点)まで行ったときに、そのまま始点(もしくは終点)に折り返して検索を続けることが出来ました。

今まで知らなくて、終点まで行ったら行き止まりだったのでDirectionをいちいち切り替えたりしちゃってました・・・。
最近Xcodeもたまにいじるのですが、Eclipseの方が断然使いやすい印象です。慣れてなくて細かい機能を知らないうちはイライラしてましたが、やはり大変優秀な開発環境だと思い直しました。

検索ボックス
カテゴリ: Android SDK
投稿者: terada
startActivityForResultを使ってBluetoothAdapter.ACTION_REQUEST_DISCOVERABLEを呼び出す際のonActivityResult内での判定の仕方が特殊だったのでメモ。

private static final int REQUEST_DISCOVERABLE = 1;
private static final int DURATION = 300; // 持続期間

Intent discoverableIntent =
new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
discoverableIntent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, DURATION);
startActivityForResult(discoverableIntent,REQUEST_DISCOVERABLE);

public void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (requestCode)
{
case REQUEST_DISCOVERABLE:
//成功時のresultCodeは「Activity.RESULT_OK」ではなく、持続期間の秒数になる。
//拒否された場合は0になる。

if (resultCode==DURATION)
{
// result ok ...
}
else
{
// result cancel ....
}
break;
default :
break;
}
}

2010/11/17: Cursorの走査

カテゴリ: Android SDK
投稿者: terada
初歩的で申し訳ありませんが、Cursorオブジェクトの中身を全部走査する方法。
他にも考えられるけど、実行速度的にはこの二つが速い様子。(paternAの方が若干速いかも??)

// paternA 
Cursor curA = getCursor();
int a = 0;
for(int i=0; i<curA.getCount();i++)
{
curA.moveToPosition(i);
a++;
}
if(curA!=null) curA.close();

// paternB
Cursor curB = getCursor();
int b = 0;
// curB.moveToNext(); // ←あってもなくても一緒みたい
while(curB.moveToNext())
{
b++;
}
if(curB!=null) curB.close();


以上。
カテゴリ: Device
投稿者: terada
結局解決していない問題ですが、備忘録として。

HTC Desire(OS2.2)でアプリアップデートの際に起動アクティビティを変更するとランチャーから起動できなくなる現象に遭遇しました。

状況としては、

以下のようなマニフェストXMLのアプリを一旦端末にインストールする。
<activity android:name=".ActivityA"> 
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ActivityB">
</activity>

次に、起動時のアクティビティを変更すべくマニフェストXMLを下記のように変更しインストール。
<activity android:name=".ActivityA"> 
</activity>
<activity android:name=".ActivityB">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

すると、ホーム画面やアプリ一覧画面上のランチャー(アプリのアイコン)から起動できなくなる。
(「リンクしたプログラムは電話にインストールされていません」というメッセージが表示される)

開発中のアプリであれば、一度アンインストールすれば良いのですが、公開中のアプリでDBをつかっているなど、アンインストールされるとまずい場合に厄介です。

もちろん、ホーム画面のリンクが切れるのは納得いくのですが(これは単に静的なエイリアスだと思うので)、アプリ一覧の中のランチャーが更新されていないのが解せません。android.intent.action.MAINできちんと呼ばれていないのか??

※ 下記の端末では、問題なくランチャーも更新されていました。
Motorola Milestone XT720(OS2.1update1)
Sonny Ericsson Xperia X10(OS2.1update1)
Google NexusOne(OS2.2)
※ マーケットからやるとどうなるかは試していません。
※ versionCodeを増やしてもだめでした。