2014年02月08日

ListViewでCursorAdapterを使っている際にWindow is fullが出た

たまにはAndroidのtips的なネタでも書かないと、Android開発者として忘れ去られそうなので書いてみる。

ListViewでCursorAdapterを使ってリストを表示していたらlogcatに、
W/CursorWindow(1111): Window is full: requested allocation 111 bytes, free space 11 bytes, window size 2097152 bytes
みたいなログが出てて、アプリの挙動がおかしくなることがあった。

原因は、ログのメッセージの通り、windows用のメモリが足りませんってことなんだけど、どうにかしてサイズを拡張したいので方法を調べてみた。
まずは、CursorWindow.javaのソースを眺めてみると、window sizeはsCursorWindowSizeで持っていて、
com.android.internal.R.integer.config_cursorWindowSize
から取得していた。しかし、この値はシステムで固定、しかも、privateだし、finalだし、外部から変更するためのメソッドが用意されていない。
ということで、リフレクションを使ってこの値を書き換えてみた。以下が、そのコードです。
static private void setCursorWindowSize(int size){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
try {
final Class cls = Class.forName("android.database.CursorWindow");
final Field fld = cls.getDeclaredField("sCursorWindowSize");
fld.setAccessible(true);
int before = fld.getInt(null); // default=2048*1024
fld.setInt(null, size * 1024); // extend to
int after = fld.getInt(null);
Log.d(TAG, "sCursorWindowSize:" + before + "/" + after);
} catch (Exception e) {
Log.e(TAG, e);
}
}
}

自分は、ApplicationクラスのonCreate内で、
setCursorWindowSize(8192);
みたいな感じで呼び出しました。
これで、上記のログは出なくなりました。試しに、試しにものすごい小さい値に書き換えてみたら、ログ出まくりだったので、一応指定したサイズで機能しているようです。

ちなみに、window sizeが有効なのはICS以降のようです。
(Honeycombのソースは確認できなかったので、もしかしたらHoneycomb以降かもしれませんが。Ginger Breadのソースには無かったです)

今回は、アプリ側での対応方法でしたが、もし、システム全体で拡張するならXposed module作ってしまうと手っ取り早いかもしれない。

同じような現象にお悩みの方がいたら、解決の参考になれば幸いです。
posted by まつも at 22:05| Comment(0) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2013年06月03日

DashClock Widgetを日本語化してみた

DashClock Widget使ってみた。

デザインかっこいいし、エクステンションで表示内容拡張できるし、すげーじゃん。
でも、唯一残念なのが日本語での月日の表示。
 Screenshot_2013-06-03-23-24-47.png

どうにかならないかなぁと思って、ソースコード探してみたら見つかったので、
月日の表示を日本語化してみた。
 Screenshot_2013-06-03-23-26-54.png

ついでに設定画面のメッセージとかも日本語化してみた。
 Screenshot_2013-06-03-23-26-37.png Screenshot_2013-06-03-23-26-29.png

せっかくなのでapkを公開してみる。
こちらのapkは、Play Storeで公開されているのとは別署名なので、一旦アンインストールしてから、インストールしてください。


これ使うために、SC-03EにCM10.1焼こうかと思っていたり。。。
posted by まつも at 23:35| Comment(2) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2013年05月02日

小物パッチを集めたXposed moduleを作成しました

とりあえず、比較的安全そうな、以下のパッチが入っています。

・ActionBarを下に移動する
  Screenshot_2013-04-09-22-22-58.png

・ステータスバーのバッテリー残量1%刻みで表示

・NavigaionBarを表示・非表示する

・docomo端末でMVNOなSIMでもテザリングを使えるようにするためのAPNの書き換え(docomo端末専用)

・カメラアプリのシャッター音切り替えメニューの有効化(samsung端末専用)
  Screenshot_2013-04-04-15-24-45.png


※動作検証はSC-03Eでのみ行なっています。うまく動かない端末もあると思います。
※動作保証などは一切しませんので自己責任のもとでご利用下さい。

ダウンロード:matsumod.apk
posted by まつも at 23:00| Comment(20) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2013年04月19日

Xposed moduleその後

Xposed moduleの作成の練習がてら、色々とmoduleに組み込んで遊んでます。
実際に作ってみたのは、
・カメラアプリのシャッター音切り替えメニューの有効化(samsung端末専用)
  Screenshot_2013-04-04-15-24-45.png
・docomo端末でMVNOなSIMでもテザリングを使えるようにするためのAPNの書き換え(docomo端末専用)
・ActionBarを下に移動する
  Screenshot_2013-04-09-22-22-58.png
・NavigaionBarを表示・非表示する
・ステータスバーのバッテリー残量1%刻みで表示
・TelephonyManagerで取得できる電話番号、SubscriberID, IMEIなどの偽装
  Screenshot_2013-04-11-22-26-39.png
・ContentProviderで取得できるアドレス帳データの偽装
などです。
これらのパッチは、ある程度まとまったら、パッチコレクションのアプリとして公開しようかと思います。

製作過程で、何度か書き換えに失敗して、端末が再起動を繰り返す状態に陥りました。
その場合、起動途中でadbが使える状態であれば、すかさずadb uninstallでmoduleをuninstallしてしまえば、元の状態に戻せました。
まぁ、最悪、moduleがuninstallできなくても、CWMが使える環境であれば、SDカードの直下にあるXposed-Diasabler-CWM.zipをCWMで焼けば、Xposedが無効化された状態で起動します。

直接、systemパーティションのframeworkやSystemUIをいじるよりかは、文鎮化のリスクは少ないかなと思います。
(決して、リスクがないことを保障するわけではありません。最終的には自己責任ですが…)
posted by まつも at 00:07| Comment(7) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2013年03月30日

データSIMのセルスタンバイ問題、アンテナピクトのパッチをXposedのモジュール化してみた

Androidでデータ専用SIMを使ってる方は、一度はお世話になっていると思われる(私も大変お世話になっています)、
こちらのサイトの
Android + データ専用 SIM での動作修正パッチ
http://bl.oov.ch/2012/01/android-sim.html
をXposedのモジュール化してみました。
Xposedって何?って方は、まずはこちら

これで、frameworkをごにょごにょしなくても、Xposed Installerと当モジュールをインストールすれば、パッチを使用することができます。

動作保証などは一切しませんので自己責任のもとでご利用下さい。

■使用方法
Xposed Installerのインストール
こちらを参考に
http://pqovopq.seesaa.net/article/353148384.html

パッチモジュールのインストール
こちらから
datasim_patcher.apk
をダウンロード、インストールします

パッチモジュールの有効化
ランチャーからXposed Installerを起動
 setting1.png
modulesタブを表示します
 setting2.png
「Datasim Patcher」のタイトル部分をタップすると設定画面が開きます
 setting3.png
使用している端末に応じて、patch modeを選択します
また、「緊急通報のみ」の表示を消したい場合は、display "Emergency calls only"をdisableにします
 setting4.png
設定が終わったらバックキーで元の画面に戻ります
「Datasim Patcher」のチェックボックスをONにします(忘れずに!!)
 setting5.png
frameworkタブのSoft rebootを押すか、端末の電源ボタンで再起動します
パッチが有効になります

使用前
 before.png
        ↓
使用後
 after.png


使用可能な端末や、処理モードは、こちらの情報に準じると思います
http://bl.oov.ch/2012/01/android-sim_10.html

中で何をやってるか心配でインストールを躊躇してるとか、Xposedのモジュールを作ってみたいけど作り方がよく分からないとか、そんな方のために、当モジュールのソースコードも公開してますので、興味がありましたら見てみてください。
https://github.com/matsumo/datasim_patcher続きを読む
posted by まつも at 09:31| Comment(23) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2013年03月29日

Xposedの日本語解説サイトが見当たらなかったので書いてみた

Xposedは、Android端末内のありとあらゆるアプリ(システムファイルも含め)の、メソッドの書き換えや、リソースの置き換えが出来る便利なツールです。
しかも、メソッドの書き換えや、リソースの置き換えの部分は、モジュールとしてapkファイルで提供されているので、必要なものをインストール、有効化して、端末を再起動するだけで使用できます。
今までのような、framework.jarをばらして、smaliを書き換えて再度固めて置き換えて、といった面倒から開放されます。

必要な条件:
・rooted端末
・OSが4.0.3以上

■使い方
まずは、
http://forum.xda-developers.com/showthread.php?t=1574401
から、XposedInstaller.apkをダウンロードしてインストールします。
Xposed Installerを起動して、「Install/Update」をタップします。
端末を再起動します。

これで準備が整いました。
次に、使いたいモジュールをダウンロードしてインストールします。
http://www.villainrom.co.uk/forum/forums/xposed_framework_mods/
ここに、モジュールがたくさん登録されています。(ダウンロードには無料の会員登録が必要です)
インストールしたら、Xposed Installerを起動して、Modulesタブでチェックをつけて有効化します。
端末を再起動すると、モジュールが有効になります。


■モジュールを作ってみたい方
こちらのチュートリアルが参考になります
https://github.com/rovo89/XposedBridge/wiki/Development-tutorial

私もいくつかモジュールを書いてみましたが、とてもわかりやすいです。
posted by まつも at 00:13| Comment(0) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2012年02月04日

どのアプリが出したか、わかりやすいトースト作ってみた

通常のToastは文字しか出なくて、今動かしているアクティビティが表示しているのか、
もしかしたらサービスやウィジェットが表示しているのか、いまいちわかりづらいです。

そこで、Toastのtextの左側にアプリアイコンを表示するようにしてみた。
これで、どのアプリケーションが表示したToastなのか一目瞭然。

使用前
使用前

使用後
使用後


使い方は簡単。
こちらのソースをcloneして、
ライブラリプロジェクトで使用する設定にして、通常のToastの代わりにHoneyToastを使用するだけです。

さらに!
makeTextのあとにshow()をよく忘れる人のために、makeTextAndShow()メソッドも用意したよ!
posted by まつも at 11:32| Comment(1) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2011年01月01日

3000Viewerから3kNetViewerへ

新年明けましておめでとうございます。
昨年は、Android関係で色々な経験をしたり、沢山の方々との出会いもあり、自分にとってとても内容の濃い1年でした。
今年は、Android関連は更に大躍進をする年になると思います。
微力ながら私も貢献していきたいと思います。

さて、先月あたりから、3000Viewerが使用できない状態となっていましたが、これは配信元のiPhone用のデータが、iPhone以外では使用できなくなってしまったためです。
というわけで、生き残りの方法を模索していたのですが、現時点で一番よいと思われる選択として、配信元のデータとして、PC向けのサービスである産経NetViewを使用することにしました。
利用者の方にはがっかりさせてしまいますが、こちらは月額315円の有料サービスです。(私への実入りは1円も無いのですが…)
選んだ理由としては、
・産経さんにお金が入るので、制限をかけ辛い
・産経NetViewの利用規約上、PCのビューアー以外での利用を禁じていない(今後変更の可能性はあります)
があげられます。

有料とは言っても1日あたり約10円です。iPad用の産経新聞HDの30日1500円よりも、はるかにリーズナブルです。
さらにiPhone版では当日のみ閲覧可能ですが、Android版では過去1週間分の閲覧が可能です。
どうしても無料で見たい方は、このアプリでは無理なので素直にiPhoneを購入しましょう。
もしくは、産経さんがAndroid版の無料公式アプリを出してくるまで待つかですね。(いつになるかは分かりませんが…)

というわけで、3000Viewer改め3kNetViewerをAndroid Marketに公開中です。
(今回は、色々考えたのですが野良アプリでの配信は行わないつもりです)

アプリ紹介ページへ
posted by まつも at 16:51| Comment(26) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2010年10月25日

WebViewのZoomControlは表示せずに、マルチタッチのズームのみを有効にする

WebViewを使ったアプリを作っていて、
WebView内蔵のZoomControlは表示しないでズームボタンは自前で処理したいけど、
マルチタッチのズームはWebViewで処理させたくて色々試したけどうまくいかず…
ZoomControlを表示すれば、マルチタッチのズームは有効になるんだけど、
ZoomControlを非表示にすると、マルチタッチのズームも無効になってしまう。

そこで、WebViewのソースを追って解決方法を見つけたのでメモ。

WebViewのズーム関連のメソッドはWebSettings内の以下の2つ
setSupportZoom
setBuiltInZoomControls

WebViewのソースを見てみると、両方共trueをセットしたときのみマルチタッチが有効になるようになっていました。

そこで、
setSupportZoom(true)
setBuiltInZoomControls(true)
を呼び出したあと、リフレクションを使用してsetBuiltInZoomControlsの内部保持用の変数である
mBuiltInZoomControlsにfalseをセット

すると、ZoomControlは表示せずに、マルチタッチのズームのみ有効にすることが出来ました。
実際のコードは以下のような感じ。

WebSettings ws = webView.getSettings();
ws.setBuiltInZoomControls(true);
ws.setSupportZoom(true);
try{
//マルチタッチを有効にしたまま、zoom controlを消す
Field nameField = ws.getClass().getDeclaredField("mBuiltInZoomControls");
nameField.setAccessible(true);
nameField.set(ws, false);
}catch(Exception e){
e.printStackTrace();
ws.setBuiltInZoomControls(false);
}
posted by まつも at 22:57| Comment(5) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする

2010年10月10日

韓国LG社製のOptimus GT540を購入

LG Optimus GT540を購入して1週間ほど経過しました。
日本で、この端末についてブログに書いている人をあまり見かけないので、使ってみた感想を書いてみました。
(かなり個人の主観が入ってますが…)
購入を検討されている方の参考になれば幸いです。

■よいところ
・電池が持つ(体感的にはX10miniの倍くらい) バッテリー容量は1500mAh
・持ちやすいサイズ(カタログスペックはほぼHT-03Aと同じだけど、持った感じは一回り小さくて手にすっぽり納まる感じ)
・安い(本体だけなら2万円くらい)
・結構さくさく (QuadrantベンチマークによるとXperia並み?HT-03Aよりはかなり速い)
    gql.png
・HVGA
・標準UI(HTC SenceやXpreiaみたいな変なカスタマイズ入ってないので素直)
・見た目がAndroidっぽくない(ガラケーっぽい)
・root取得可能
・barnacle tetherばっちり動く(要root)
・titanium backupも動く(要root)

■残念なところ
・タッチパネルが感圧式(慣れるとこれはこれで有りな気もしますが。Graffitiはすごく使いやすい)
・ストラップホールが無い(ネジ穴に引っ掛ける方法で試用中)
・OSが1.6(非公式ながら2.1も来ていて導入可能→しばらく使ってますが非常に快適です)
・カメラ用フラッシュが無い
・シャッター音が消せない(root取れば消せます)


個人的には非常に気に入っていて、常用端末として使っています。(X10 miniの出番が全く無くなってしまいました…)

HT-03Aのサイズが手にしっくり来ると感じているんだけど、もう少し早くて、電池が持つ端末があればなー
って思っている人には、かなりよい選択肢だと思います。(値段も安いですし)

日本語の情報が少ないので、
購入後のPCへのドライバの入れ方やrootの取り方、
OSアップデートの仕方などを少しずつ書いていこうかと思います。
posted by まつも at 20:09| Comment(2) | TrackBack(0) | Android | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。