カテゴリー
SugiBlog Webエンジニアのためのお役立ちTips

Honeycomb Cursor関連のエラー

SQLiteデータベースを扱うアプリをAndroid3.2搭載の端末に入れていてエラーが発生した。
詳細は省略しますが、以下のようなエラーが出ます。
RuntimeException: Unable to resume activity
IllegalStateException: trying to requery an already closed cursor

クエリを実行しようとしたが、カーソルが閉じているとエラーが出ています。
どうやらカーソルマネージャー機能がなくなったよう。

というわけで、マネージャーを使うのをやめ、クローズ処理をアクティビティのonDestroy()に集約。
これでエラーは解消された。

Android2.2、2.3では正常に動作するので、バージョン違いの互換性による問題のようです。
代わりのメソッドが用意されている場合もあるので、Reflectクラスを利用すれば互換性を持たせることは可能なようです。

参考?
http://d.hatena.ne.jp/ukiki999/20100524/p1

1,897 views

Webサービスとの連携

org.apache.httpクラスを使ってHTTP通信をおこないます。

AndroidManifest.xmlにインターネット接続許可の記述を追加します。

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

Getメソッド

public String doGet( String url )
{
    try
    {
        HttpGet method = new HttpGet( url );

        DefaultHttpClient client = new DefaultHttpClient();

        // ヘッダを設定する
        method.setHeader( "Connection", "Keep-Alive" );

        HttpResponse response = client.execute( method );
        int status = response.getStatusLine().getStatusCode();
        if ( status != HttpStatus.SC_OK )
            throw new Exception( "" );

        return EntityUtils.toString( response.getEntity(), "UTF-8" );
    }
    catch ( Exception e )
    {
        return null;
    }
}

続きを読む…»

6,920 views

Androidアプリ公開

Androidアプリ「たびろく」を公開しました。
https://market.android.com/search?q=tabiroku&c=apps

「たびろく」は旅の思い出を記録するアプリです。
タイトルとコメントを付けて保存することができ、それをそのままmixiやFacebook等のメール更新が可能です。

1,698 views

設定項目を無効にする Preference

PreferenceActivityのonCreateで処理します。
例では条件を何も指定していませんが、任意に条件を指定して実装してください。

例)チェックボックスの設定項目を無効化

PreferenceScreen prefScreen = getPreferenceScreen();
CheckBoxPreference checkboxPreference = 
    (CheckBoxPreference)prefScreen.findPreference("key");
checkboxPreference.setEnabled(false);

子項目として親項目と依存関係を持たせる場合

PreferenceScreen prefScreen = getPreferenceScreen();
CheckBoxPreference checkboxPreference = 
    (CheckBoxPreference)prefScreen.findPreference("key");
checkboxPreference.setDependency("親項目のkey");

xmlで指定

android:dependency="親項目のandroid:key"
9,413 views

GoogleMapのアイコンタップ

GoogleMapにアイコンを表示し、タップすると何らかの処理をしたいとき、通常のonTapメソッドで処理を実行しようとすると、地図の拡大縮小時、アイコンに指が触れているとタップされたことになってしまいます。

これを回避するために、ジェスチャーリスナーを実装し、シングルタップアップにて処理をするようにします。

android.view.GestureDetector.OnGestureListener
public class PinItemizedOverlay extends ItemizedOverlay<OverlayItem> implements OnGestureListener {

    private List<GeoPoint> points = new ArrayList<GeoPoint>();
    private Context context;
    private GestureDetector gestureDetector = null;
    private MapView mMapView;
    private Drawable defaultMarker;

    public PinItemizedOverlay(Drawable defaultMarker, Context context) {
        super( boundCenterBottom(defaultMarker) );
        setLastFocusedIndex(-1);
        populate();
        this.context = context;
        this.defaultMarker = defaultMarker;
        gestureDetector = new GestureDetector(this);
    }

    @Override
    protected OverlayItem createItem(int i) {
        GeoPoint point = points.get(i);
        OverlayItem overlayItem = new OverlayItem(point, null, null);
        overlayItem.setMarker(boundCenterBottom(defaultMarker)); //これをしないとhitTestでNullPointerExceptionが発生します。
        return overlayItem;
    }

    @Override
    public int size() {
        return points.size();
    }

    public void addPin(GeoPoint point, String title, String snippet, int icontype) {
        if (getIndexGeoPoint(point) == -1) {
            this.points.add(point);
            this.icontype.add(icontype);
        }
        setLastFocusedIndex(-1);
        populate();
    }

    // 位置が一致するか(一致しない場合は -1を返す)
    private int getIndexGeoPoint(GeoPoint newPoint) {
       int result = -1;
       int size = this.points.size();
       for (int i = 0; i < size; i++) {
          GeoPoint point = this.points.get(i);
          if (point.equals(newPoint)) {
             result = i;
             break;
          }
       }
       return result;
    }

続きを読む…»

2,835 views