【Android6.0适配注意事项】

      各位开发者小伙伴们,为了更好地适配Android6.0系统,给用户提供更好地体验,我们发出Android6.0适配注意事项,欢迎开发者小伙伴交流探讨,感谢各位对乐视应用开放平台的支持!

 

1.权限部分

Android6.0(API Level 23)的权限机制发生了改变,新 的权限机制更好的保护了用户的隐私,Google将权限分为两类,一类是NormalPermissions,这类权限一般不涉及用户隐私,是不需要用户 进行授权的,比如手机震动、访问网络等;另一类是Dangerous Permission,一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等。当用到某些权限时,应当检查是否已授权。

值得注意一点,这里有特殊权限授权的区别,分别是SYSTEM_ALERT_WINDOW  WRITE_SETTINGS,虽然这两个权限也是属于dangerous权限类型,但是这两个授权请求方式和其他dangerous权限是不一样的,需 要特殊处理 。

Normal Permissions如下:

ACCESS_LOCATION_EXTRA_COMMANDS READ_SYNC_SETTINGS
ACCESS_NETWORK_STATE READ_SYNC_STATS
ACCESS_NOTIFICATION_POLICY RECEIVE_BOOT_COMPLETED
ACCESS_WIFI_STATE REORDER_TASKS
BLUETOOTH REQUEST_INSTALL_PACKAGES
BLUETOOTH_ADMIN SET_TIME_ZONE
BROADCAST_STICKY SET_WALLPAPER
CHANGE_NETWORK_STATE SET_WALLPAPER_HINTS
CHANGE_WIFI_MULTICAST_STATE TRANSMIT_IR
CHANGE_WIFI_STATE USE_FINGERPRINT
DISABLE_KEYGUARD VIBRATE
EXPAND_STATUS_BAR WAKE_LOCK
GET_PACKAGE_SIZE WRITE_SYNC_SETTINGS
INTERNET SET_ALARM
KILL_BACKGROUND_PROCESSES INSTALL_SHORTCUT
MODIFY_AUDIO_SETTINGS UNINSTALL_SHORTCUT
NFC

DangerousPermissions如下:

Permission Group Permissions
CALENDAR
CAMERA
CONTACTS
LOCATION
MICROPHONE
PHONE
SENSORS
SMS
STORAGE
  1. 1、权限的检查:

if(ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {

}else{

// }

这里涉及到一个API,ContextCompat.checkSelfPermission,主要用于检测某个权限是否已经被授予,方法返回值为PackageManager.PERMISSION_DENIED或者PackageManager.PERMISSION_GRANTED。当返回DENIED就需要进行申请授权了。

 

  1. 2、申请权限:

ActivityCompat.requestPermissions(thisActivity,newString[]{Manifest.permission.READ_CONTACTS},MY_PERMISSIONS_REQUEST_READ_CONTACTS);

该方法是异步的,第一个参数是Context;第二个参数是需要申请的权限的字符串数组;第三个参数为requestCode,主要用于回调的时候检测。可以从方法名requestPermissions以及第二个参数看出,是支持一次性申请多个权限的,系统会通过对话框逐一询问用户是否授权。

 

  1. 3、处理权限申请回调:

@Override

public voidonRequestPermissionsResult(intrequestCode, String permissions[], int[]grantResults)

{

switch (requestCode) {

caseMY_PERMISSIONS_REQUEST_READ_CONTACTS: { /

/ If request is cancelled, the result arrays areempty.

if(grantResults.length>0&&grantResults[0] ==PackageManager.PERMISSION_GRANTED) { /

/ permission was granted, yay! Do the //contacts-related task you need to do. } else {

// permission denied, boo! Disable the //functionality that depends on this permission.

} return; }

}

}

对于权限的申请结果,首先验证requestCode定位到你的申请,然后验证grantResults对应于申请的结果,这里的数组对应于申请时的第二个 权限字符串数组。如果你同时申请两个权限,那么grantResults的length就为2,分别记录你两个权限的申请结果。如果申请成功,就可以做你 的事情了~

 

2.网络相关

Android6.0移除了HttpClient,建议用HttpURLConnection替代。

在build.gradle中加上

android {

useLibrary 'org.apache.http.legacy'

}

 

3.通知

移除了Notification.setLatestEventInfo()方法。用Notification.Builder类来构造通知

 

4.音频音量相关

Android6.0不再支持通过AudioManager类来直接对特定的音频流设置音量和静音。因此:

setStreamSolo()方法过时(deprecated),替换调用requestAudioFocus()方法;

setStreamMute()方法过时,替换调用为adjustStreamVolume()方法,传入的值也变为ADJUST_MUTE 或 ADJUST_UNMUTE。

 

5.文本选择(Text Selection)

用户在应用中选择文字后,你现在可以显示一个浮动工具栏(floatingtoolbar),展示并进行剪切、拷贝、粘贴操作,交互过程的实现和contextual action bar的实现一样,实现选择文字后的浮动工具栏,在app代码中需要做如下修改:

(1)在View 或 Activity对象,ActionMode的调用从startActionMode(Callback) 变为startActionMode(Callback, ActionMode.TYPE_FLOATING)

(2)替换原有的ActionMode.Callback为ActionMode.Callback2

(3)重写OnGetContentRect()方法,提供内容Rect对象(文本选择的矩形框)在view中的位置

(4)在矩形框作为唯一的元素不再有效时,调用invalidateContentRect()方法

 

如果你在使用Android Support Library revision22.2,需要注意浮动工具栏不向后兼容且因为appcompat默认接管ActionMode对象,阻止了浮动工具栏被显示。为了在 AppCompatActivity中支持ActionMode,需要调用getDelegate()方法,之后对返回的 AppCompatDelegate对象调用setHandleNativeActionModesEnabled()方法,并设置输入参数为 false,该调用将ActionMode对象的控制交还给系统框架层。在Android6.0(API level 23)的设备上,框架层支持ActionBar或浮动工具栏模式,在Android 5.1(API level 22)及以下的设备上,只支持ActionBar模式。