2010年11月30日火曜日

現在のdalvik VMはアプリのヒープを16Mに制限している

http://groups.google.com/group/android-framework/msg/cda4cd5d5da2b2d8 から引用。

the VM currently limits app heaps to 16MB.
This allows for a reasonable number of apps to run.


ふーん。

NTTドコモのAndroid端末のユーザーエージェント

FAQに書いてあった。
【図】答え弊社Android端末標準webブラウザのユーザーエージェントは、下記のとおりとなります。

端末ファームウェア
バージョン
(ビルド番号)
ユーザーエージェント
HT-03AAndroid 1.5Mozilla/5.0 (Linux; U; Android 1.5; ja-jp; HT-03A Build/CDB72)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
Android 1.6Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; Docomo HT-03A Build/DRD08)
AppleWebKit/528.5+(KHTML, like Gecko) Version/3.1.2 Mobile Safari/ 525.20.1
Xperia™Android 1.6
(R1EA018)
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA018)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
Android 1.6
(R1EA025)
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA025)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
Android 1.6
(R1EA029)
Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SonyEricssonSO-01B Build/R1EA029)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
Android 2.1
(2.0.B.0.138)
Mozilla/5.0 (Linux; U; Android 2.1-update1; ja-jp; SonyEricssonSO-01B Build/2.0.B.0.138)
AppleWebKit/530.17 (KHTML, like Gecko) Version/4.0 Mobile Safari/530.17
LYNX SH-10BAndroid 1.6Mozilla/5.0 (Linux; U; Android 1.6; ja-jp; SH-10B Build/S7023)
AppleWebKit/528.5+ (KHTML, like Gecko) Version/3.1.2 Mobile Safari/525.20.1
GALAXY SAndroid 2.2Mozilla/5.0 (Linux; U; Android 2.2; ja-jp; SC-02B Build/FROYO)
AppleWebKit/533.1(KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
GALAXY TabAndroid 2.2Mozilla/5.0 (Linux; U; Android 2.2; ja-jp; SC-01C Build/FROYO)
AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1

2010年11月27日土曜日

HTML5でファイルのドラッグアンドドロップしてみた

jQuerySyntaxhighlighter使って、HTMLファイルを読みやすくしてみた。
ファイルのドラッグアンドドロップよりも、むしろ、SyntaxHighlighter.highlight()に気づくまで時間かかった。

Chrome 7.0.517.44とFirefox 3.6.10で動いた。
IE8とSafari 5.0.2は動かなかった。

ここにHTMLファイルをドロップする。

Drop your html files here.

<style>
.drophere {
  padding: 0.25em;
  width: 50%;
  border: 1px solid #666;
  background: #eee;
}
.dragover {
  background: #8f8
}
</style>
<div id="dropzone">
<div class="drophere" align="center">ここにHTMLファイルをドロップする。<br/>
Drop your html files here.</div>
</div>
<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">google.load("jquery", "1.3");</script>
<script type="text/javascript">
$(function(){
  $('#dropzone .drophere')
    .bind('dragenter', function(ev) {
      $(ev.target).addClass('dragover');
      return false;
    })
    .bind('dragleave', function(ev) {
      $(ev.target).removeClass('dragover');
      return false;
    })
    .bind('dragover', function(ev) {
      return false;
    })
    .bind('drop', function(ev) {
      $(ev.target).removeClass('dragover');
      var dt = ev.originalEvent.dataTransfer;
      for (var i = 0; i < dt.files.length; ++i) {
        var file = dt.files[i];
        var reader = new FileReader();
        reader.onloadend = function() {
          $('#dropzone')
          .append(
          $('<pre/>')
          .html($('<div/>').text(reader.result).html())
          .addClass('brush: html'));
          SyntaxHighlighter.highlight();
        };
        reader.readAsText(file, 'utf-8');
      }
      return false;
    });
});
</script>




2010年11月17日水曜日

Androidでスクリーンの方向を指定してみたらもやもやした

ゲームとかで画面の表示方向を固定したいことがある。

AndroidManifest.xmlでactivityのscreenOrientation属性で指定する方法が一般的だと思う。

<activity
  ...
  android:screenOrientation="landscape"
  ...>

この指定は実行時に変更することができる。

縦長固定に変える
Activity#setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

横長固定に変える
Activity#setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

システムに決めてもらう
Activity#setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);

「システムに決めてもらう」設定にしておくと、重力センサーなどに従って、自動的に自然な方向に回転したりする。

普通の時は自由に回転させておくけれど、ボタンを押したときには「その時の方向で固定」したいこともある。

public void lockScreenOrientation() {
    switch (getResources().getConfiguration().orientation) {
    case Configuration.ORIENTATION_LANDSCAPE:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
        break;
    case Configuration.ORIENTATION_PORTRAIT:
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
        break;
    case Configuration.ORIENTATION_SQUARE:
        // ここではどうしたらいい?
        break;
    }
}


世の中には正方形のデバイスもあるらしい。
確かに横長でも縦長でもないけれど、正方形だとしてもデバイスの方向ってやつがあるはずでしょぅ
そう考えると、SQUAREっていう報告は来ないはず…
実機で試してみたいなぁー
あーもやもやする

2010年11月16日火曜日

<application>の直下に<meta-data>を書いてもいいのかもしれない

AndroidManifest.xml<meta-data>の説明では、<meta-data>の親になるのは、

  • <activity>
  • <activity-alias>
  • <service>
  • <receiver>

の4つしか書いてない。

だけど、ApplicationInfoにはmetaDataフィールドがあるし、
実機で検証したところ、期待通りに機能している。

public static Object getAppMetaData(Context context, String key) {
    try {
        final Bundle metaData =
            context
            .getPackageManager()
            .getApplicationInfo(
                context.getPackageName(),
                PackageManager.GET_META_DATA)
            .metaData;
        if (null != metaData) {
            return metaData.get(key);
        }
    } catch (NameNotFoundException e) {
    }
    return null;
}

「動く」けど、ドキュメントに書かれていない、この便利な機能を使ってよいのだろうか?

答えがないかと探していたら、見つけたっぽい。

AdMobのガイド
<application>の子要素で<meta-data>使って"ADMOB_PUBLISHER_ID"をセットしている。

AdMobがこの仕組みを使ってるってことは、だれでも使っていいってことだろう。
いつかドキュメントが更新されるに違いない。
もしも問題になったとしても、解決策がすぐに提案されるだろう。

2010年11月8日月曜日

Androidでアプリ実行中にフルスクリーンにしたりしなかったり

ボタンを押したらフルスクリーンにする。
もうひとつのボタンをおしたら元に戻す。
@Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  findViewById(R.id.btnFullScreen).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    getWindow().addFlags(
      WindowManager.LayoutParams.FLAG_FULLSCREEN);
   }
  });
  findViewById(R.id.btnNotFullScreen).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    getWindow().clearFlags(
      WindowManager.LayoutParams.FLAG_FULLSCREEN);
   }
  });
 }