Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
デフォルトアプリとパーミッション
Search
katsuki-nakatani
November 09, 2017
Programming
230
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
デフォルトアプリとパーミッション
katsuki-nakatani
November 09, 2017
More Decks by katsuki-nakatani
See All by katsuki-nakatani
Android 10 対応 Tips
katsukinakatani
0
120
InAppUpdate実装&InAppBillingClientVer2.0実装例
katsukinakatani
0
610
AndroidJetpack概要 &旧AACの紹介
katsukinakatani
0
710
ViewModel使ってますか?
katsukinakatani
0
330
Target SDK Version 26に上げる時につまづいたこと
katsukinakatani
3
2.9k
Whats new android wear (umeda.apk #3 LT)
katsukinakatani
1
510
Android 7.1.1 AppShortcuts setup(DevfestKansai Lightning Talk)
katsukinakatani
1
710
Firebase Authentication & Firebase Realtime Database setup
katsukinakatani
2
910
Firebase Setup for Android Studio2.2
katsukinakatani
1
640
Other Decks in Programming
See All in Programming
Even G2とAWSで推しのエージェントを召喚しよう!
har1101
1
120
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
170
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
740
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.4k
さぁV100、メモリをお食べ・・・
nilpe
0
150
1B+ /day規模のログを管理する技術
broadleaf
0
110
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
230
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
130
Lessons from Spec-Driven Development
simas
PRO
0
220
AI時代のUIはどこへ行く?その2!
yusukebe
22
7.5k
正しくソフトウェアを作る、前提を疑うための認知の視点 / doubt-premise
minodriven
21
7k
LLM本来の能力を解き放つサンドボックス技術とAI民主化への適用
yukukotani
3
4.5k
Featured
See All Featured
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
30 Presentation Tips
portentint
PRO
1
330
Amusing Abliteration
ianozsvald
1
210
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.6k
Abbi's Birthday
coloredviolet
3
8.2k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.6k
WENDY [Excerpt]
tessaabrams
11
38k
Utilizing Notion as your number one productivity tool
mfonobong
4
330
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
210
Scaling GitHub
holman
464
140k
Documentation Writing (for coders)
carmenintech
77
5.4k
Transcript
デフォルトアプリとパーミッション 2017/11/9 Osaka Mix Leap Study #1 - Android /
iOS
Speaker 中谷 克紀 仕事 Enterprise Server Engineer GDG 神戸スタッフ Twitter @KatsukiNakatani
早速ですが皆さん 「android.permission.MODIFY_PHONE_STATE」知っていますか? Androidアプリにおけるパーミッション(権限)の一つです
パーミッション? Androidのアプリを動かすための権限の仕組み ・アプリに「センサー」や「データ」を取得または更新を許可するもの(ユーザーが許諾するもの) ・AndroidManifest.xmlに定義をします <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.exampke.hogehoge" android:installLocation="auto"> <uses-permission android:name="android.permission.INTERNET"
/> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PROFILE" android:maxSdkVersion="22" /> </manifest>
Android 6.0で仕組みが変わりました ストアからアプリをインストールする際に権限を許諾する 「Installed Permission」から アプリ側で必要な時に必要な権限を要求する 「Runtime Permission」に変更されました
パーミッションには種類がある adb shell pm list permissions -f -g + permission:android.permission.READ_CONTACTS
package:android label:read your contacts description:Allows the app ... protectionLevel:dangerous + permission:android.permission.MODIFY_PHONE_STATE package:android label:null description:null protectionLevel:signature|privileged 一般アプリで使用可能 Runtime Permission機能で権限を許可 一般アプリで使用不可能 システムアプリのみで許可
MODIFY_PHONE_STATEで何が出来る? ・電話の発着信をフックして切断等が可能 ・不在着信の消去など
Android 2.2では MODIFY_PHONE_STATEはユーザーアプリに許可されていた ただし、着信を切断したりすることが可能でリスキーな権限な為、 Android2.3以降はシステムアプリでしか使用できなくなってしまいました。
Android 2.3以降では 不在通知のタップ処理は Intentで拾えるが、 不在通知が消せない 通知をタップ
ちなみに 未読ログはWRITE_CALL_LOGの権限で消せる(フラグは更新できる) val content = context.contentResolver value.put(CallLog.Calls.NEW, 0) value.put(CallLog.Calls.IS_READ, 1)
content.update(CallLog.Calls.CONTENT_URI, value, CallLog.Calls.TYPE + "=" + CallLog.Calls.MISSED_TYPE + " AND " + CallLog.Calls.NEW + "='1'" + " AND " + CallLog.Calls.IS_READ + "='0'", null) CallLogデータベース上は、未読は0件になるが、通知は消えなく、 通知に表示される未読件数も別のところ(TelecomManager)で管理されているため、 通話履歴の件数はずっと増え続けるし表示に不整合が起きる
Lollipopで通話関連APIが整理 API Level21(Lollipop)で増えている これで通知が消せる!
Let’s Try! あかん
Permissionを書いてみる やっぱりあかん
「MODIFY_PHONE_STATE」必要
Default Appsにしたら呼べる
どうするか まずはデフォルトアプリとして選択できるようにしたい
必要なIntentFilterを登録すると選択できるよう になります PhoneAppとして登録出来る要件は 下記のDialerとして反応するIntentFilterをManifestに登録すること <intent-filter> <action android:name="android.intent.action.VIEW" /> <action android:name="android.intent.action.DIAL"
/> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="tel" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.DIAL" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter>
通話ログ消去の実装 val content = context.contentResolver ContentValues().apply{ put(CallLog.Calls.NEW, 0) put(CallLog.Calls.IS_READ, 1)
}.also{ content.update(CallLog.Calls.CONTENT_URI, it, CallLog.Calls.TYPE + "=" + CallLog.Calls.MISSED_TYPE + " AND " + CallLog.Calls.NEW + "='1'" + " AND " + CallLog.Calls.IS_READ + "='0'", null) } val manager = context.getSystemService(Context.TELECOM_SERVICE) as TelecomManager if (TextUtils.equals(manager.defaultDialerPackage, context.packageName)) { manager.cancelMissedCallsNotification() ・・・デフォルトアプリでない場合は落ちる } 通知ログDBの更新 デフォルトアプリとして登録 されているか判断し、通知を消去 HogeActivityやHogeService
https://source.android.com/devices/tech/connect/call-notification Android 7.0で少し仕組みが変わる Android 6.0以前では左記の表の通りに 機能の住み分けが行われていた
https://source.android.com/devices/tech/connect/call-notification Android 7.0 and later
https://source.android.com/devices/tech/connect/call-notification Android 7.0で少し仕組みが変わる 不在着信通知がカスタマイズ できるんじゃ?
Try!
Manifestにレシーバとサービスを追加 <receiver android:name=".MissedCallNotificationReceiver" android:directBootAware="true"> <intent-filter> <action android:name="android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION" /> </intent-filter> </receiver>
不在着信を受け取るレシーバ レシーバから呼び出すサービス <service android:name=".MissedCallNotificationService" android:permission="android.permission.BIND_JOB_SERVICE" android:enabled="true" android:exported="true" />
ManifestにPermissionを追加 //READ_PHONE_STATEが無いと、BroadcastReceiverでIntentを受け取れない <uses-permission android:name="android.permission.READ_PHONE_STATE" />
レシーバの実装 class MissedCallNotificationReceiver : BroadcastReceiver() { override fun onReceive(context: Context,
intent: Intent) { val action = intent.action if (ACTION_SHOW_MISSED_CALLS_NOTIFICATION != action) { return } val count = intent.getIntExtra(EXTRA_NOTIFICATION_COUNT, UNKNOWN_MISSED_CALL_COUNT) val number = intent.getStringExtra(EXTRA_NOTIFICATION_PHONE_NUMBER) if (count > 0) MissedCallNotificationService.enqueueWork(context, MissedCallNotificationService.createIntent(context, count, number)) } companion object { val ACTION_SHOW_MISSED_CALLS_NOTIFICATION = "android.telecom.action.SHOW_MISSED_CALLS_NOTIFICATION" val EXTRA_NOTIFICATION_COUNT = "android.telecom.extra.NOTIFICATION_COUNT" val EXTRA_NOTIFICATION_PHONE_NUMBER = "android.telecom.extra.NOTIFICATION_PHONE_NUMBER" val UNKNOWN_MISSED_CALL_COUNT = -1 } }
通知を上げるサービスの実装 class MissedCallNotificationService : JobIntentService() { companion object { …
fun enqueueWork(context: Context, work: Intent) { enqueueWork(context, MissedCallNotificationService::class.java, JOB_ID, work) } ... override fun onHandleWork(intent: Intent) { //通知処理を実装 }
Run 自作アプリで不在着信通知を 受け取ることに成功
危険性は? デフォルトアプリはユーザーが選択(インストール+既定の設定)するもの。 (自動的にアプリで書き換えるものではない) ※ただし警告などが出るわけではないので、やはり開発元を信頼するしか無いのは 変わらず
まとめ ・Android 6.0以降の「Default Apps」を使えば、システムにしか許可されていなかったパーミッション(API)を一部扱うことが出来ます ・Default Appの電話の機能については、Android7.0以降で更に整理が進み、TelecomアプリとDialerアプリで 機能の分離が行われ、開発者はより電話の機能を組み込んだアプリを作れるようになりました ・とにかく文献が無いのでソースを読むしか無い ・Android ThingsにSIM乗せて、特定の着信があったら何かアクションするとか、一昔前のギミックみたいで
面白そうだなと思ったり
おしまい 御清聴ありがとうございました 実際このアプリに実装済みなのでよければ試してみてください https://goo.gl/SHVRgC https://goo.gl/tqTKRB サンプルソース