TargetApi 22からTargetApi 26へのアップグレードに関する注意事項
9431 ワード
最近、グーグルのお父さんは8月に、googleplayに登場するアプリをTargetApi 26以上にアップグレードしなければならないと要求しています.TargetApi 22を長年使っている私として、TargetApi 26へのアップグレードの影響を検討しなければなりません.主に以下の通りです.
1.ランタイム権限
インベントリ・ファイルでの権限を宣言すると、ユーザーのプライバシーやデバイスの操作に大きなリスクがなくなり、アプリケーションに自動的に権限が付与されます.そうでなければ、ユーザーはこれらの権限の付与に明確に同意する必要があります.権限危険等級は3種類に分けられ、その中で危険権限はユーザーが動的に授権しなければならない.
1.1 Normal permissions:
TYPE_を使用する必要がありますAPPLICATION_OVERLAY、このtypeを同時に使用した後:1)ただし、重要なシステムウィンドウ(ステータスバー、IMEなど)の下にある2)システムは、このような形式のウィンドウの位置、大きさ、可視性を調整することができる3)api 26の携帯電話で動作し、アプリケーションが[TYPE_APPLICATION_OVERLAY]を使用して懸濁窓をポップアップする限り、システムは自動的に通知を送信し、ユーザーに「xxxが他のアプリケーションに表示されている」ことを通知し、ユーザーは通知欄をクリックすることでジャンプすることができる.サスペンション権限の無効化
申請TYPE_APPLICATION_MOVERLAY権限のコード:
MODE_の使用WORLD_READADBLEまたはMODE_WORLD_WRITEABLEの操作により、SecurityExceptionがトリガーされます.
MODE_WORLD_READABLE:このファイルの内容は他のプログラムによって読み取ることができる;MODE_WORLD_WRITEABLE:このファイルの内容は他のプログラムで読み書きできます
3.App外部にfile://タイプのURIを露出できない
IntentがこのようなURIを持って外部Appを開く(例えば、システムカメラを開いて写真を撮る)と、FileUriExposedException異常が放出されます.
COLUMN_LOCAL_FILENAMEはAndroid 7.0にはdeprecatedと表記され、旧バージョンではCOLUMNへのアクセスに適用されている.LOCAL_FILENAMEでアクセスできないパスが表示される場合があります.Android N以降のアプリケーション向けCOLUMNへのアクセスを試みています.LOCAL_FILENAME時にSecurityExceptionがトリガーされます.
5.ユーザーアカウント情報の使用
アンドロイド8.0では、アプリケーションはauthenticatorが所有するアカウント情報またはユーザーが許可したアカウント情報しか使用できません.GETのみ申請ACCOUNTS権限はアカウント情報の許可を得るには不十分であり、使用権限を得るためにAccountManagerを呼び出す必要がある.新ChooseAccountIntent()または他のauthenticatorに関連する方法.権限が得られた後、アプリケーションはAccountManagementを呼び出すことができる.getAccounts()を使用して、アカウント情報を取得します.
Android 8.0廃棄LOGIN_ACCOUNTS_CHANGED_ACTIONは、addOnAccountsUpdatedListener()を使用してランタイムアカウントの変更を取得する必要があります.
6.権限グループの調整
アンドロイド8.0の前に、アプリケーションが実行時に権限を申請し、ユーザーがこの権限を付与した場合、システムはこの権限が属する権限グループのmanifestに登録された権限を誤ってこのアプリケーションに付与します.
targetApiが8.0のアプリケーションでは、以上の動作が修正され、アプリケーションは申請の権限のみを付与されます.ただし、適用後に同じ権限グループ内の他の権限を申請すると、自動的に付与されます.
例えば、アプリケーションは、ManifestにREAD_を同時に登録するEXTERNAL_STORAGEとWRITE_EXTERNAL_STORAGの2つの権限.targetApi=25以降のバージョンでは、アプリケーション要求READ_EXTERNAL_STORAGE権限がユーザーに許可されると、WRITE_が自動的に付与されます.EXTERNAL_STORAG権限、READ_EXTERNAL_STORAGEとWRITE_EXTERNAL_STORAGは同じSTORAGE権限グループに属し、manifestに登録されています.しかし、Android 8.0システムでは、READ_しかありません.EXTERNAL_STORAGEは許可されますが、アプリケーションがWRITEを再申請するとEXTERNAL_STORAG権限の場合、ユーザーに直接権限を与えるように要求されません.
関連公式説明:
https://developer.android.com/about/versions/marshmallow/android-6.0-changes
https://developer.android.com/about/versions/nougat/android-7.0-changes
https://developer.android.com/about/versions/oreo/android-8.0-changes#o-apps
1.ランタイム権限
インベントリ・ファイルでの権限を宣言すると、ユーザーのプライバシーやデバイスの操作に大きなリスクがなくなり、アプリケーションに自動的に権限が付与されます.そうでなければ、ユーザーはこれらの権限の付与に明確に同意する必要があります.権限危険等級は3種類に分けられ、その中で危険権限はユーザーが動的に授権しなければならない.
1.1 Normal permissions:
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MANAGE_OWN_CALLS
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_COMPANION_RUN_IN_BACKGROUND
REQUEST_COMPANION_USE_DATA_IN_BACKGROUND
REQUEST_DELETE_PACKAGES
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS
1.2 Signature permissionsシステムはインストール時にこれらのアプリケーション権限を付与するが、権限を使用しようとするアプリケーションが定義された権限のアプリケーションと同じ証明書によって署名されている場合のみ.BIND_ACCESSIBILITY_SERVICE
BIND_AUTOFILL_SERVICE
BIND_CARRIER_SERVICES
BIND_CHOOSER_TARGET_SERVICE
BIND_CONDITION_PROVIDER_SERVICE
BIND_DEVICE_ADMIN
BIND_DREAM_SERVICE
BIND_INCALL_SERVICE
BIND_INPUT_METHOD
BIND_MIDI_DEVICE_SERVICE
BIND_NFC_SERVICE
BIND_NOTIFICATION_LISTENER_SERVICE
BIND_PRINT_SERVICE
BIND_SCREENING_SERVICE
BIND_TELECOM_CONNECTION_SERVICE
BIND_TEXT_SERVICE
BIND_TV_INPUT
BIND_VISUAL_VOICEMAIL_SERVICE
BIND_VOICE_INTERACTION
BIND_VPN_SERVICE
BIND_VR_LISTENER_SERVICE
BIND_WALLPAPER
CLEAR_APP_CACHE
MANAGE_DOCUMENTS
READ_VOICEMAIL
REQUEST_INSTALL_PACKAGES
SYSTEM_ALERT_WINDOW
WRITE_SETTINGS
WRITE_VOICEMAIL
1.3 Dangerous permissions危険な権限を使用するには、ユーザーに実行時に権限を付与するように要求する必要があります.android.permission.READ_CALENDAR
android.permission.WRITE_CALENDAR
android.permission.CAMERA
android.permission.READ_CONTACTS
android.permission.WRITE_CONTACTS
android.permission.GET_ACCOUNTS
android.permission.ACCESS_FINE_LOCATION
android.permission.ACCESS_COARSE_LOCATION
android.permission.RECORD_AUDIO
android.permission.READ_PHONE_STATE
android.permission.READ_PHONE_NUMBERS
android.permission.CALL_PHONE
android.permission.ANSWER_PHONE_CALLS
android.permission.READ_CALL_LOG
android.permission.WRITE_CALL_LOG
android.permission.ADD_VOICEMAIL
android.permission.USE_SIP
android.permission.PROCESS_OUTGOING_CALLS
android.permission.BODY_SENSORS
android.permission.SEND_SMS
android.permission.RECEIVE_SMS
android.permission.READ_SMS
android.permission.RECEIVE_WAP_PUSH
android.permission.RECEIVE_MMS
android.permission.READ_EXTERNAL_STORAGE
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.SYSTEM_ALERT_WINDOW
浮遊窓の権限について:android.permission.SYSTEM_ALERT_WINDOW同時api 26時から、以下の5種類のtypeは廃棄され使用できないが、api 26より下のバージョンの携帯電話では以下のtypeが使用できるため、api 26のサスペンション窓の互換処理が必要である:TYPE_PHONE TYPE_PRIORITY_PHONE TYPE_SYSTEM_ALERT TYPE_SYSTEM_OVERLAY TYPE_SYSTEM_ERRORTYPE_を使用する必要がありますAPPLICATION_OVERLAY、このtypeを同時に使用した後:1)ただし、重要なシステムウィンドウ(ステータスバー、IMEなど)の下にある2)システムは、このような形式のウィンドウの位置、大きさ、可視性を調整することができる3)api 26の携帯電話で動作し、アプリケーションが[TYPE_APPLICATION_OVERLAY]を使用して懸濁窓をポップアップする限り、システムは自動的に通知を送信し、ユーザーに「xxxが他のアプリケーションに表示されている」ことを通知し、ユーザーは通知欄をクリックすることでジャンプすることができる.サスペンション権限の無効化
申請TYPE_APPLICATION_MOVERLAY権限のコード:
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SYSTEM_ALERT_WINDOW) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.CALL_PHONE},
MY_PERMISSIONS_REQUEST_ALERT);
}
}
if (!Settings.canDrawOverlays(MainActivity.this)) {
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, 10);
}
2.プライベートファイルのファイル権限はすべてのアプリケーションに権限を与えないMODE_の使用WORLD_READADBLEまたはMODE_WORLD_WRITEABLEの操作により、SecurityExceptionがトリガーされます.
MODE_WORLD_READABLE:このファイルの内容は他のプログラムによって読み取ることができる;MODE_WORLD_WRITEABLE:このファイルの内容は他のプログラムで読み書きできます
3.App外部にfile://タイプのURIを露出できない
IntentがこのようなURIを持って外部Appを開く(例えば、システムカメラを開いて写真を撮る)と、FileUriExposedException異常が放出されます.
String cachePath = getApplicationContext().getExternalCacheDir().getPath();
File picFile = new File(cachePath, "test.jpg");
Uri picUri = Uri.fromFile(picFile);
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, picUri); startActivityForResult(intent, 100);
4.DownloadManagerは、プライベートストレージのファイルをファイル名で共有しなくなりました.COLUMN_LOCAL_FILENAMEはAndroid 7.0にはdeprecatedと表記され、旧バージョンではCOLUMNへのアクセスに適用されている.LOCAL_FILENAMEでアクセスできないパスが表示される場合があります.Android N以降のアプリケーション向けCOLUMNへのアクセスを試みています.LOCAL_FILENAME時にSecurityExceptionがトリガーされます.
5.ユーザーアカウント情報の使用
アンドロイド8.0では、アプリケーションはauthenticatorが所有するアカウント情報またはユーザーが許可したアカウント情報しか使用できません.GETのみ申請ACCOUNTS権限はアカウント情報の許可を得るには不十分であり、使用権限を得るためにAccountManagerを呼び出す必要がある.新ChooseAccountIntent()または他のauthenticatorに関連する方法.権限が得られた後、アプリケーションはAccountManagementを呼び出すことができる.getAccounts()を使用して、アカウント情報を取得します.
Android 8.0廃棄LOGIN_ACCOUNTS_CHANGED_ACTIONは、addOnAccountsUpdatedListener()を使用してランタイムアカウントの変更を取得する必要があります.
6.権限グループの調整
アンドロイド8.0の前に、アプリケーションが実行時に権限を申請し、ユーザーがこの権限を付与した場合、システムはこの権限が属する権限グループのmanifestに登録された権限を誤ってこのアプリケーションに付与します.
targetApiが8.0のアプリケーションでは、以上の動作が修正され、アプリケーションは申請の権限のみを付与されます.ただし、適用後に同じ権限グループ内の他の権限を申請すると、自動的に付与されます.
例えば、アプリケーションは、ManifestにREAD_を同時に登録するEXTERNAL_STORAGEとWRITE_EXTERNAL_STORAGの2つの権限.targetApi=25以降のバージョンでは、アプリケーション要求READ_EXTERNAL_STORAGE権限がユーザーに許可されると、WRITE_が自動的に付与されます.EXTERNAL_STORAG権限、READ_EXTERNAL_STORAGEとWRITE_EXTERNAL_STORAGは同じSTORAGE権限グループに属し、manifestに登録されています.しかし、Android 8.0システムでは、READ_しかありません.EXTERNAL_STORAGEは許可されますが、アプリケーションがWRITEを再申請するとEXTERNAL_STORAG権限の場合、ユーザーに直接権限を与えるように要求されません.
関連公式説明:
https://developer.android.com/about/versions/marshmallow/android-6.0-changes
https://developer.android.com/about/versions/nougat/android-7.0-changes
https://developer.android.com/about/versions/oreo/android-8.0-changes#o-apps