2012/10/06

[n7]Androidアプリを作ろう (2)

前回の最後に書いた「プロローグにはコンテンツを指定できません」は、AndroidManifest.xmlにゴミを書いていただけだった。
寝ぼけながらやっていたせいかな。
消すと、大丈夫だった。


とりあえず、一度アプリを動かしておこう。

Nexus7の「設定アプリ>開発者向けオプション」を選択し、右上を「ON」にした後、

  • USBデバッグ

にチェックをする。
他にもなんかチェックしたかもしれんけど、忘れた。
私は、アニメーション効果が苦手なので無効にしているくらいで、それはデバッグには関係ないな。

Nexus7の尻にあるmicroUSBに付属していた電源用のUSBケーブルを挿し、片方をPCに挿す。
PC側にドライバがインストールされていれば、たぶんうまくいく。
Nexus7の上の方に、角が生えた何かのアイコンが表示されていれば、大丈夫だろう。

EclipseのPackage Explorerで作ったプロジェクト上で右クリックし「Run As>Android Application」と選択すると、Android Device Chooserってのが起動した(Emulatorを起動してるから?)。
Nexus7っぽい名前があるから、それを選択すると、アプリをインストールして起動してくれ・・・。

 

起動しなかった。
エラーが出てる。

java.lang.SecurityException: Permission Denial: starting Intent
requires android.permission.NFC

 

なんだろう?


AndroidManifest.xmlの「Application」タブで、

image

を設定していたのだが、これをなくすとうまくいった。

これを設定すると、AndroidManifest.xmlでは

<application android:permission="android.permission.NFC">

のように、applicationタグの中に展開される。

 

日本語訳を ありがたく参照。。。したが、なんだかよくわからない。
IBMのはわかりやすかったが、applicationタグの説明がなかった。

  • <uses-permission>
    保護された機能にアクセスすることを宣言。
    宣言せずに使おうとすると、ユーザに通知せずに失敗する。
    デフォルトでは、全部保護されてる。
    インストール時に、ユーザに対して「これこれにアクセスしますよ」のことか。
  • <application android:permission>
    アプリケーションのデフォルトpermission。
  • <activity android:permission>
    アクティビティごとのpermission。
    指定しない場合は、applicationのpermissionが使われる。

ということか。

しかし、これだけだと、なんで今回怒られたのか説明が付かない。

ためしに、applicationのpermissionを削って、activityに移してみたが、やはり同じエラーになる。

<uses-permission>を削っても、同じ。
まあ、これはわかる。

<uses-feature>を削っても、同じ。

あれこれ考えたが、

  • <uses-permission>・・・ユーザの保護目的(こんなのにアクセスするけどいい?)
  • <application android:permission>・・・アプリの保護目的(許可を得てないと許さん!)

ということかしら。

activityのpermission説明にも、startActivity()やstartActivityForResult()は反応しないようなことが書かれてある。

Permissionの説明があるんだけど、うーん、わかったようなわからんような。。
自分のアプリで、<uses-permission>と<application android:permission>に同じものを指定してるのなら、実行できてもいいんじゃないのか?


eclipseから起動させようとしたエラーをもう少しよく見た。

ActivityManager: java.lang.SecurityException: Permission Denial:
 starting Intent {
  act=android.intent.action.MAIN
  cat=[android.intent.category.LAUNCHER]
  flg=0x10000000
  cmp=com.example.nfctest1/.MainActivity
 }
 from null (pid=4104, uid=2000)
  requires android.permission.NFC


Nexus7から実行した場合。

E/Launcher(3370): java.lang.SecurityException: Permission Denial:
starting Intent {
 act=android.intent.action.MAIN
 cat=[android.intent.category.LAUNCHER]
 flg=0x10200000
 cmp=com.example.nfctest1/.MainActivity
}
from ProcessRecord{41c287e0 3370:com.android.launcher/u0a31}
(pid=3370, uid=10031)
 requires android.permission.NFC

 

ああ、つまり起動元がpermission.NFCを持ってないよ、ということなんだ。
startActivity()がうんたらかんたら、は、こういうことなのか。

つまり、Activityなどにpermissionを持ったものを起動させたければ、直接の起動元にpermissionがなければならん、ということになる。
ランチャーもまた、例外ではないということだ。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。