前回の最後に書いた「プロローグにはコンテンツを指定できません」は、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」タブで、
を設定していたのだが、これをなくすとうまくいった。
これを設定すると、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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。