Notice: get_currentuserinfo の使用はバージョン 4.5.0 から非推奨になっています ! 代わりに wp_get_current_user() を使ってください。 in /var/www/html/blog/wp-includes/functions.php on line 3831 Call Stack: 0.0000 228232 1. {main}() /var/www/html/blog/index.php:0 0.0001 228672 2. require('/var/www/html/blog/wp-blog-header.php') /var/www/html/blog/index.php:17 0.1232 6180648 3. require_once('/var/www/html/blog/wp-includes/template-loader.php') /var/www/html/blog/wp-blog-header.php:19 0.1247 6190176 4. include('/var/www/html/blog/wp-content/themes/zbench/archive.php') /var/www/html/blog/wp-includes/template-loader.php:74 0.1247 6190208 5. get_header() /var/www/html/blog/wp-content/themes/zbench/archive.php:1 0.1247 6190792 6. locate_template() /var/www/html/blog/wp-includes/general-template.php:45 0.1247 6191032 7. load_template() /var/www/html/blog/wp-includes/template.php:647 0.1248 6205280 8. require_once('/var/www/html/blog/wp-content/themes/zbench/header.php') /var/www/html/blog/wp-includes/template.php:688 0.1263 6221560 9. wp_head() /var/www/html/blog/wp-content/themes/zbench/header.php:8 0.1263 6221608 10. do_action() /var/www/html/blog/wp-includes/general-template.php:2589 0.1263 6222280 11. WP_Hook->do_action() /var/www/html/blog/wp-includes/plugin.php:453 0.1263 6222376 12. WP_Hook->apply_filters() /var/www/html/blog/wp-includes/class-wp-hook.php:323 0.1365 6380560 13. call_user_func_array:{/var/www/html/blog/wp-includes/class-wp-hook.php:298}() /var/www/html/blog/wp-includes/class-wp-hook.php:298 0.1365 6381168 14. add_google_analytics() /var/www/html/blog/wp-includes/class-wp-hook.php:298 0.1368 6381952 15. ga_current_user_is() /var/www/html/blog/wp-content/plugins/google-analyticator/google-analyticator.php:1116 0.1368 6381984 16. get_currentuserinfo() /var/www/html/blog/wp-content/plugins/google-analyticator/google-analyticator.php:1289 0.1368 6382208 17. _deprecated_function() /var/www/html/blog/wp-includes/pluggable-deprecated.php:49 0.1368 6382696 18. trigger_error() /var/www/html/blog/wp-includes/functions.php:3831

Tag Archives: Android - Page 2

AndEngine 何もしないアプリをつくる

SDKはいれとけ

 AndEngineをいじっています。よくわかっていないので、勉強しながらブログ書いてます。

 今回はAndEngineを用いた空っぽのプロジェクトをつくります。
 SDKのインストールなど終え、Androidアプリをビルドできる環境が整っている事が前提条件です。
 SDKインストールの話は以前に書いたのですが、もうだいぶ昔(2009)の話で内容も古いので、ビルド環境整ってない場合は他をあたってください。

 準備できたら次行きます。

とりあえずHello worldまで

AndEngineの取得

 まず、AndEngineが必要です。


 ダウンロードして任意のフォルダに保存します(僕はeclipseのworkspaceディレクトリの中にlibディレクトリ作ってその中に入れてます)。
 この前のエントリで、zipファイルでダウンロードする説明をしましたが、git cloneで取得した方が利点が多いです。ぜひgitで。

eclipseへのインポート

 取得したAndEngineのプロジェクトファイルをelipseへインポートします。
 メニューバー[ファイル]→[インポート]

1_import

 OSやeclipseのバージョン等によって少し画面は違うかもしれません。画面のとおり、インポートする種別はAndroid Codeを選んで下さい。[次へ]を押下します。

2_import2

 [Browse]ボタンから、先程ダウンロードしておいたAndEngineのディレクトリを探して設定します。あとは[完了]押して終わり。
 プロジェクト・エクスプローラにAndEngineプロジェクトが出現していれば成功です。

3_AndEngineAdded

プロジェクトの作成

 新規プロジェクトを作成します。
 メニューバー[ファイル]→[新規]→[プロジェクト]

4_NewProject

『Android Application Project』を選択して[次へ]。

5_NewAndroidApplication

 アプリの名前やパッケージ名を決めて下さい。ここではBlankAppなどとしてます。
 [次へ]。

6_NewAndroidApplication

 手順を省くため、『Create custom launcher icon』のチェックは外してます。他は特に変更せずに[次へ]。

7_NewAndroidApplication

 特に何もせず(『Blank Activity』のまま)[次へ]で進みます。

8_NewAndroidApplication

 Activityとレイアウトファイルの命名です。サンプルプログラムなのでこのままいきます。
 [完了]を押下するとプロジェクトが生成されます。この時点でビルドして実行できるプロジェクトになっています。試しに実行すると以下です。

Hello?

9_HelloWorld

AndEngineのリンクから実行まで

AndEngineとリンクする

 作成した新規プロジェクト『BlankApp』のプロパティを開きます。
 メニュー[ファイル]→[プロパティ]、もしくはプロジェクト・エクスプローラのBlankAppを右クリックして表示されるコンテキストメニューからの[プロパティ]でも同じ。
 左のツリーから『Android』を選択。

10_prop

 右下のライブラリ設定で『Add』押下でAndEngineを選択して[OK]。

11_AddAndEngine

 これでAndEngineライブラリを利用できるようになりました。

最初のコーディング

 早速、MainActivity.javaを編集していきます。
 先に見せるとできあがりはこれ。ただ灰色の画面になる。

12_BlankApp

 スタイル定義がうまくなくて、ソースの貼り付けが汚いですがごめんなさい。後で直します。

[gist id=5904733]

SimpleBaseGameActivity

  • Line:13,14
    描画領域の定義です。480×720。固定値に疑問を持つかもしれませんがとりあえずこのままで。
  • Line:12
     まず、MainActivityをSimpleBaseGameActivityのサブクラスにします。これにより、最低限以下3つのメソッドを実装する必要があります。

onCreateEngineOptions()

 AndEngineへの設定を行います。

  • Line:18
    Cameraクラスで描画領域の宣言をします。起点座標と幅、高さ。
  • Line:19
    • EngineOptions()
    1. true = フルスクリーンにする。
    2. PORTRAIT_FIXED = 縦画面
    3. RatioResolutionPolicy = 画面の拡大/縮小のオプションで、与えた幅と高さの比率を守って拡大/縮小するようにしています。
    4. 領域サイズを設定したカメラオブジェクト

onCreateResources()

 スプライトやサウンドデータの読み込みを行う場所ですが今回は不要なので何もしません。
 空実装でオケー。

onCreateScene()

 描画の実施です。

  • Line:31
    背景色を灰色に設定しています。RGBですが値の有効範囲は0〜1のfloatです。
     エミュレータの解像度が480×800なので、オプションで定義した領域より広く、少しスキマが開いているのがわかります。

おわり

 とりあえず以上でAndEngineを用いた空っぽのプロジェクトができました。

 疲れたね(キャプチャして貼り付けるのが)。

fedoraでAndroid爆速エミュレータ

いまさら爆速エミュレータの話

 実のところ「Androidのエミュレータは遅い」というのは既に過去の話であり、『Android 爆速エミュレータ』みたいな感じでググるとセットアップ情報は無限に出てきます。だから「遅いからー、Androidのエミュレータって遅いからー、ありえないからー」みたいな事は大きな声で喋らないほうがいいです。
 自分も、Windows上の開発環境でIntel Atom でのエミュレータを試してその軽快さを体験済みです。
 アトムー。

が、しかし、

Screenshot_from_2013-06-28 01:15:28

同じ事を試そうと、普段使っているLinux(fedora18)でアクセラレータをインストールしようとしたら、「Not compatible with Linux」とかもう相手にされてなくてあっさり諦めてました。

 今までは、ほぼ実機中心の開発だったのでその点について深追いせずにいたのですが、先日、AndEngineのエントリ書くときに久しぶりにエミュレータの構築して、試したら遅すぎて、再度トライしてみることにしました。ありえないから。

いきなり解決した

  • Install KVM: open GOOGLE, write “kvm installation “
  • Create AVD with “Intel atom x86” CPU/ABI
  • Run from command line: emulator -avd avd_name -qemu -m 512 -enable-kvm
  • Or run from Eclipse: Run/Run Configurations/Tab “Target” – > check Intel x86 AVD and in “Additional Emulator Command Line Options” window add: -qemu -m 512 -enable-kvm (click Run)

 わりとざっくり気味に書かれてますが、概ねこのとおりにすればfedoraでも速いエミュレータが手に入ります。
 ただ、自分の環境では既にKVMはインストールされていた(たぶん何かのパッケージをインストールした際に依存関係によって、か、最初から)ので、改めて何かをインストールすることなく、CPUを「Intel Atom」にして、起動オブションを「-avd avd_name -qemu -m 512 -enable-kvm」にしただけです。

 カタスカシ

Ubuntuの人は

 Linux環境で、Intel Atomで、Androidエミュレータ、みたいな感じで調べてみると、日本語でもポツポツ情報出てきます。

 実は今回、先にこのコンテンツに辿り着いていて、ただ、この記事はUbuntu環境での解説で、手順にfedoraでは用意されていないパッケージが登場したりしてるなどして、そのまま試せませんでした。
 あと、この手順では、KVMのユーザ作ったりしてるのですが、同様に成功したfedoraでは特に作ってません。

 不要なのかな?
 ちょっとわかってない。

AndEngineExamplesのビルド

IMG_0808

AndEngineExamples

 AndEngineを利用したサンプルアプリであるAndEngineExamplesをビルドし、Nexus7で動かすまでを説明します。


 AndEngineExamplesは実装サンプル数が非常に豊富で、起動するとまず以下のカテゴリメニューが表示されます。括弧内の数字は、各々のカテゴリ配下のサンプル数。なななんとぜんぶで84サンプル。すごい。AndEngineでどんな事が出来るのかを知るにはうってつけです。

  • AndEngineExamples
    • Simple (5)
    • Modifier & Animation (8)
    • Touch (7)
    • ParticleSystems (3)
    • Multiplayer (3)
    • Physics (8)
    • Text (7)
    • Audio (3)
    • Advanced (3)
    • Post-Processing (2)
    • Backgrounds (3)
    • Other (22)
    • Apps (1)
    • Games (3)
    • Benchmarks (6)

GooglePlayに置いてあるよ

 そう、実はAndEngineExamples、GooglePlayに置いてある。だからビルドする必要なし。おわり。違う。このアプリ、Nexus7でGooglePlayから検索しても出てこない。Webブラウザから探すと出てくるけど、Nexus7へインストールしようとすると互換性がないと叱られてしまうんですね。
 互換性がないって事はないと思うけど公開側が許可してないなら仕方がないので自分でビルドすることにします。それがこのエントリです。

1_Screenshot_from_2013-06-20 13:49:15

ソースコードのダウンロードとインポート


 とりあえず、上記2つのソースコード(Androidプロジェクト)をダウンロードして展開します。
 フォルダ名は次のように”-GLES2″を削除しておきましょう。あとでリンクの際に煩わしい作業をしなくて済みます。

  • 『AndEngine-GLES2』 → 『AndEngine』
  • 『AndEngineExamples-GLES2』 → 『AndEngineExamples』


 次に、eclipseへインポートします。2つとも。
 プロジェクトのインポートについて詳しく書かないので、親切な他の誰かが書いている何かを見て下さい。メニュー[ファイル]→[インポート]でどうぞ。
 で、2つのプロジェクトをインポートすると、AndEngineExamplesについてはビルドエラーになるはずです。

エラーの解消1:拡張ライブラリへのリンク

 AndEngine向けに開発されたExtensionライブラリがいくつかあります。
 AndEngineExamplesは、拡張を含めた様々なサンプルを実装しているため、各種Extensionを使用しています。エラーになる理由の1つは、Extensionへのリンク切れです。

3_Screenshot_from_2013-06-20 10:44:44

 プロジェクトのプロパティを見ると必要とする拡張ライブラリがわかると思います。結構ある。
 2013/06/21現在の拡張ライブラリのライナップは12こですが、AndEngineExamplesが必要とするのは以下9こです。全部ダウンロードしましょう。ビルドに必要です。

AndEngineExamplesが必要とする拡張ライブラリ


 これらの拡張ライブラリも、展開後のディレクトリに”-GLES2″が付いてますので削除します。AndEngineMODPlayerExtensionについては、”-GLES2″ではなく”-master”です。削除して下さい。あちなみにGLES2ってのは『OpenGL ES 2』ってことですね。
 これらのライブラリを全部eclipseにインポートします。

4_Screenshot_from_2013-06-20 10:52:35

 インポートする度にリンク切れが解消されていくのがわかります。全部やって下さい。

エラーの解消2:間違ったコード

 将来的にこの問題は解消されると思いますが、現時点でのAndEngineExamplesプロジェクトはコーディングミスによりビルドが通りません。既にpull requestも出ているので、そのうち修正されるでしょう。
 以下をなおしましょう。


  • /AndEngineExamples/src/org/andengine/examples/HullAlgorithmExample.java

Line:11

修正前)
import org.andengine.entity.primitive.vbo.DrawMode;
修正後)
import org.andengine.entity.primitive.DrawMode;


  • /AndEngineExamples/src/org/andengine/examples/TextBreakExample.java

Line:106

修正前)
this.mText = new Text(50, 40, this.mFont, “”, 1000, new TextOptions(AutoWrap.LETTERS, AUTOWRAP_WIDTH, Text.LEADING_DEFAULT, HorizontalAlign.CENTER), vertexBufferObjectManager);
修正後)
this.mText = new Text(50, 40, this.mFont, “”, 1000, new TextOptions(AutoWrap.LETTERS, AUTOWRAP_WIDTH, HorizontalAlign.CENTER, Text.LEADING_DEFAULT), vertexBufferObjectManager);


  • /AndEngineExamples/src/org/andengine/examples/BoundCameraExample.java

Line:220

修正前)
final AnimatedSprite face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager()).animate(100);
修正後)
final AnimatedSprite face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager());
face.animate(100);


  • /AndEngineExamples/src/org/andengine/examples/SplitScreenExample.java

Line:179

修正前)
final AnimatedSprite face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager()).animate(100);
修正後)
final AnimatedSprite face = new AnimatedSprite(pX, pY, this.mBoxFaceTextureRegion, this.getVertexBufferObjectManager());
face.animate(100);

これでビルドは通るはず。

AndEngine a Go Go!

Screenshot_from_2013-06-22 08:33:16

以上。

AndEngineことはじめ

AndEngine

AndEngineはAndroid向けに開発された2Dゲームエンジンです。
オープンソースでGitHubでホストされてます。

Android開発の書籍を漁ってたら、Androidで2Dゲーム作る書籍が出てて、そこで初めてAndEngineを知りました。Androidで利用できるゲームエンジンは他にもあるようですが、評判も良さそうなので少し挑戦してみることにします。

ライセンス

AndEngineはLGPLライセンスという事なのですが、すこし複雑そうなので後で整理してみようと思います。

開発環境

以下の環境で開発します。

  • PC: ThinkPad X220
  • OS: fedora 18
  • IDE: eclipse 4.2.2 JUNO
  • SDK: Android 4.2.2(API 17)
  • ADT: ver.22.0.1
  • Java: ver. 1.7.0_03

エミュレータでの動作

実機でだけ動かす人(エミュレータ使わない人)は飛ばしてください。
エミュレータでAndEngine動かないみたいな記事を読んだ気もするけど動くみたいなので書いておきます。
AVD Managerを起動して新規作成します。
以下キャプチャの設定で動きました。OSやeclipse、ADTなど諸々のバージョン差異で画面違うかもしれないけど大筋こんな感じで設定しておけばいいです。画面下部の「Use Host GPU」がキモです。忘れずに。

2_Screenshot_from_2013-06-20 02:10:50

AndEngineの入手

AndEngineライブラリはGitHubでホストされているので勝手にダウンロードしてください。

ZIPアーカイブをダウンロードします。
展開すると『AndEngine-GLES2』というディレクトリ名になりますが”-GLES2″を削除して『AndEngine』という名前に変更してから、eclipseへインポートするのが無難です。これは、ソース公開されている既存アプリが『AndEngine』の名前でライブラリへリンクを張っているためです。

次回はサンプルプログラムのビルドを行います。

読:『AndEngineでつくるAndroid 2Dゲーム』

 積読になってますた。

 AndEngineは、Android向けに開発されたオープンソースの2Dゲームエンジンで、GitHubで公開されてます。

ゲーム開発初心者でもJavaの専用ライブラリを使えばアイデアを即ゲーム化できる!

と、下世話な謳い文句がオビじゃなく表紙に印字されてて、
AndEngineで誰でもラクショーにゲーム作れるよ!
みたいな雰囲気が頂けませんが、僕もAndEngineでサクッとカジュアルゲーム作って大儲けしてみようと思います。

『JOJOしりとり』のリリース

JOJOしりとりロゴアイコン

 先日(2012/11/23)、Androidアプリ『JOJOしりとり』をリリースしました。
 今回、初めてのアプリ公開だったので、色々と勉強しながらも駆け足でリリースに至りました。

■はじめに
 『JOJOしりとり』は名前のとおり、しりとり遊びをするゲームアプリで、ジョジョの奇妙な冒険を題材としています。
 あらかじめ用意された言葉の中から、相手(CPU)が選んだ言葉に繋がる言葉を選んで対戦します。

■勝敗とスコア
 ゲームの勝敗は、しりとりを継続できなくなったらゲーム終了とし、その時の獲得点数が相手より多ければ勝ちとしています。
 よって、自分の番になって継続できなくなった場合、一般的なしりとりでは負けとなりますが、本ゲームでは相手よりも多くの点数を獲得していれば勝ちとなります。
 また、いくつの言葉を繋げたか、もゲームにおける重要な要素です。
 点数は、繋げた言葉の文字列長×10点が加算されます(「ポルナレフ」なら5文字x10で50点)。

■追及してほしい
 このゲームで「最高何点取れるのか」、「最大何語繋げられるのか」を追及して欲しいです。
 この考えから本ゲームでは偶然の要素を排除しています。
 プレイヤーが選択した言葉に対し、相手は決められたルールに基づいて次の言葉を選択します。繋げられる言葉の中からランダムに選択するという事はしません。
 これにより、同じ手順をなぞれば過去の対戦を再現する事が可能です。プレイヤーが必ず先行になるのもこの理由からです。

■収録語
 ジョジョの奇妙な冒険は歴史が長く、多数の用語が存在します。
 ジョジョの奇妙な冒険の1部から7部までに登場した人名とスタンド名、計400を超える言葉を収録しています。
 しりとりに重要な先頭と末尾の文字のバリエーションには極端な偏りもなくゲームに適していました(もし『アンパンマンしりとり』を作ったらゲームバランスは最悪でしょう)。
 ただ、初回リリースでは「ゾ」と「ピ」で始まる言葉を収録していなかったため、初手で「イルーゾォ」や「スコリッピ」を選んだ場合、即時ゲーム終了となってしまう問題があります。
 この問題(当初これは問題と考えていなかった)については近日中に、技の名前や道具等の固有名詞を増強したアップデートを行う際にカバーします。

■7部までしか収録していない理由
 現在、第8部が連載中となっていますが、連載に合わせて収録語のアップデートを行ってしまうと、相手の行動(言葉の選択)が以前と異なってしまうため、8部の言葉はあえて収録していません。
 これはハイスコアを追及してほしいという考えによるものです。
 近日中に技の名前や道具等の言葉を追加する予定ですが、今後積極的に収録後のアップデートは行わないつもりです。

■特殊ルール1:パートカウンターボーナス
 特殊なルールの1つに『パートカウンターボーナス』があります。
 これは、相手が選んだ言葉が属するパート(1〜7部)に対し、同じパートに属する言葉を繋げた場合、加算ポイントが倍で計上されるシステムです。
 更に同じパートの言葉を繋げると、更に倍、となります。
 このルールにより、ジョジョの奇妙な冒険をより良く知っている人の方が高得点を取ることが可能となっています。

■特殊ルール2:類似語の使用禁止
 通常のしりとりでも、「ジョセフ」が既出の状況で「ジョセフ・ジョースター」を出したらよい顔をされないでしょう。
 本ゲームではこの場合、「ジョセフ」を使用したら以降、「ジョセフ・ジョースター」は使用できないルールとしています。
 更に特殊なルールとして、上記ルールを拡張し、同じものを指す語もその対象としています、例えば同じ人物を指す「リサ・リサ」と「エリザベス・ジョースター」など、他方を使用したらもう一方は使用不可となります。

2013.01.12 追記:
一部の単語を除き、上記後半部のルールを廃止させて頂きます。

■さいごに
 初回リリースでは実装できなかった機能がいくつかあります。
 それらについては、できるだけ早く実装できるよう作業を進めています。

Gunma.web #11 で喋って来ました『Android:JS』 #gunmaweb

 2012/11/23 のGunma.web #11にて、『Android:JS』というLTを行ってきました。

Gunmaweb#11 jojoshiritori from ivoryworks .

 当初の予定では、Androidアプリを作って、twitterやGoogle App Engineとの連携等、Androidアプリと言ってもWeb寄りの内容にしようと計画していたのですが、予想以上に開発時間を確保できなくて、それらの機能はごっそりドロップしたアプリがGunma.web直前に出来上がりました。
 結果、Webの話が出来なくなっちゃって「こんな工程でつくりました」という話でお茶を濁す結果に。

 出来上がったアプリがこれ。

JOJOしりとり

 当日語らなかったアプリの内容は別エントリで。

Nexus 7のBluetoothキーボード買ったら思いの外よかった

 Nexus7(16GByte)。
 元々、開発用にタブレット欲しかったのだけど、ICS版のThinkPad Tabletを狙って待ってたら全然出てこなくて。本当に出てこなくて、じゃあ、今のスマートフォン(IS03 Gingerbread)そろそろ2年経つから機種変更しようと思ったけど、今回の冬モデルに食指動かなくて悶々としてたら急に気を失って気付いたら手元にありました。ネクサスセブン。

 タブレットだしJelly Beanだし、それじゃあ愛でましょう、はいメデましょうという事でアクセサリ類を物色し始めました。

 以前、IS03向けにBluetoothキーボード探した時、ポケモンのアレとか、折りたたみのアレとか定番化してたので、とどのつまりNexus7でもポケモンか折りたたみかなと思ってたら、なんだかカッチョイイのが秋葉原にあるらしい。

Nexus 7の蓋やスタンドになる合体式キーボードが発売 キーボード付きレザーケースも登場

 ががががが合体式!ネットで買えないかなと探しても見つからなくて、しばらくしたらギズモードにこんな記事が!

Nexus 7が蓋になるBluetoothキーボード「Mobile Bluetooth Keyboard For Nexus 7」を買ってみました!

 これこの前のアレじゃん!というので即注文して即到着。
 合体合体!

 わー。
 キーストロークは思ってたよりずっと深くていいです。ただやっぱりキーピッチ小さい。意識してないと小指のAが怪しい。
 英字配列で、連続使用時間は55時間、スタンバイ時間は60日とのこと。

 このキーボードにNexus7をパコッとはめるようにします。
 両脇のツメでNexus7をホールドするかんじ。

 で、凄いのが。
 このキーボード、ノーブランドの製品なんだけど、表面がNexus7と同じような素材(同じかも)で、表面加工も似せてあるので、知らない人は純正品かと思うほど。

 難点は、EscキーとTabキーが無い事。キーバインドで解決できるのかな。あとやっぱりピッチ小さいね。
 でも、かつてはZaurusのあのちっちゃいキーボードでペチペチ打ってたので、慣れなのかもしれない。

 常時キーボード使うわけじゃないし、普段はさっと出してぱっと使いたいわけなので、時と場合によって合体して持ち歩く使い方になると思います。

読:『Android Layout Cookbook アプリの価値を高める開発テクニック』

Androidアプリ開発者向けGUIレイアウトの手引きです。
ImpressJapanで電子書籍を購入しました。こちら

 この前まで半額だったのに残念。

 「SDK 2.3対応」と書いてあるとおり、少し古い内容になっています。
ただ、レイアウトについてメインに書いている本が現状少ないという事と、まだまだ2.x系がシェア高い事を考えると、この先ICS(4.x)を見据えたとしても、レイアウトの手法を勉強するにはうってつけと思います。

adb shell からSDカードをアンマウントしたいのですがわかりません

はじめに
「adb shell からSDカードをアンマウントしたい」人ごめんなさい。
このエントリに解決方法は載ってません。ごめんなさい。

SDカードのアンマウントは、[Settings]→[SD card & phone storage]で開かれる『SD Card & phone storage settings』で行える。
(日本語の場合[設定]→[ストレージ]で『ストレージの設定』)

設定画面には以下が並ぶ。
これは AVD Android 2.3.3の場合だけど他のバージョンでも文言が違うだけで大体同じ。

『Unmount SD Card』をタップすれば、しばらくの後にアンマウントされる。

これが一般的なSDカードのアンマウント手順。

これをコマンドライン(adb shell)で行いたい。
adb shellからこんなかんじ。
# umount /mnt/sdcard/.android_secure
# umount /mnt/sdcard

先に.android_secureをアンマウントすること。
というか、いきなり/mnt/sdcardをアンマウントしてもfailed。

これでマウントポイント(/mnt/sdcard)の中身は空になるので、アンマウントできたかのように見える。

『SD card & phone storage』を開く。

手動でアンマウントした場合と状態が異なっている。
『Total space』と『Available space』はUnavailableではなく 0byteになっているし、『Mount SD Card』となるべき項目は、『Unmount SD Card』のまま。

実際にストレージがどのような状態になっているのかAPIで調べる。
次のAPIはSDカードの状態を文字列で返す。

String status = Environment.getExternalStorageState();
Environment | Android Developers

手動マウント時には、”mounted”つまりEnvironment.MEDIA_UNMOUNTEDとなるが、umountコマンドによる手段だと、”mounted”(Environment.MEDIA_MOUNTED)。

まだマウントされている状態なのかもしれない。
サイズ0のメディアをマウントしている状態のよう。

umountした後に何かしないといけないのかもしれないが。わからない。
おしえてエロい人。