Android70适配教程与心得

Android7.0发布已经有一个多月了,Android7.0在给用户带来一些新的特性的同时,也给开发者带来了新的挑战,这几天我将应用适配到Android7.0,其中也遇到了不少问题也踩了一些坑,在这里就把我在Android7.0适配上的一些心得分享给大家,让大家的应用能早一天跑在Android7.0上。

权限更改

随着Android版本越来越高,Android对隐私的保护力度也越来越大。从Android6.0引入的动态权限控制(RuntimePermissions)到Android7.0的“私有目录被限制访问”,“StrictModeAPI政策”。这些更改在为用户带来更加安全的操作系统的同时也为开发者带来了一些新的任务。如何让你的APP能够适应这些改变而不是cash,是摆在每一位Android开发者身上的责任。

目录被限制访问

一直以来,在目录及文件的访问保护方面iOS做的是很到位的,如:iOS的沙箱机制。但,Android在这方面的保护就有些偏弱了,在Android中应用可以读写手机存储中任何一个目录及文件,这也带来了很多的安全问题。现在Android也在着力解决这一问题。

在Android7.0中为了提高私有文件的安全性,面向AndroidN或更高版本的应用私有目录将被限制访问。对于这个权限的更改开发者需要留意一下改变:

私有文件的文件权限不在放权给所有的应用,使用MODE_WORLD_READABLE或MODE_WORLD_WRITEABLE进行的操作将触发SecurityException。

应对策略:这项权限的变更将意味着你无法通过FileAPI访问手机存储上的数据了,基于FileAPI的一些文件浏览器等也将受到很大的影响,看到这大家是不是惊呆了呢,不过迄今为止,这种限制尚不能完全执行。应用仍可能使用原生API或FileAPI来修改它们的私有目录权限。但是,Android官方强烈反对放宽私有目录的权限。可以看出收起对私有文件的访问权限是Android将来发展的趋势。

给其他应用传递file://URI类型的Uri,可能会导致接受者无法访问该路径。因此,在Android7.0中尝试传递file://URI会触发FileUriExposedException。

应对策略:大家可以通过使用FileProvider来解决这一问题。

DownloadManager不再按文件名分享私人存储的文件。COLUMN_LOCAL_FILENAME在Android7.0中被标记为deprecated,旧版应用在访问COLUMN_LOCAL_FILENAME时可能出现无法访问的路径。面向AndroidN或更高版本的应用在尝试访问COLUMN_LOCAL_FILENAME时会触发SecurityException。

应对策略:大家可以通过ContentResolver.openFileDescriptor()来访问由DownloadManager公开的文件。

应用间共享文件

在Android7.0系统上,Android框架强制执行了StrictModeAPI政策禁止向你的应用外公开file://URI。如果一项包含文件file://URI类型的Intent离开你的应用,应用失败,并出现FileUriExposedException异常,如调用系统相机拍照,或裁切照片。

应对策略:若要在应用间共享文件,可以发送content://URI类型的Uri,并授予URI临时访问权限。进行此授权的最简单方式是使用FileProvider类。如需有关权限和共享文件的更多信息,请参阅共享文件。

在Android7.0上调用系统相机拍照,裁切照片调用系统相机拍照

在Android7.0之前,如果你想调用系统相机拍照可以通过以下代码来进行:

Filefile=newFile(Environment.getExternalStorageDirectory(),"/temp/"+System.currentTimeMillis()+".jpg");if(!file.getParentFile().exists())file.getParentFile().mkdirs();UriimageUri=Uri.fromFile(file);Intentintent=newIntent();intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);//将拍取的照片保存到指定URIstartActivityForResult(intent,);

在Android7.0上使用上述方式调用系统相拍照会抛出如下异常:

android.os.FileUriExposedException:file:////storage/emulated/0/temp/5.jpgexposedbeyondappthroughIntent.getData()atandroid.os.StrictMode.onFileUriExposed(StrictMode.java:)atandroid.net.Uri.checkFileUriExposed(Uri.java:)atandroid.content.Intent.prepareToLeaveProcess(Intent.java:)atandroid.content.Intent.prepareToLeaveProcess(Intent.java:)atandroid.app.Instrumentation.execStartActivity(Instrumentation.java:)atandroid.app.Activity.startActivityForResult(Activity.java:)...atandroid.app.Activity.startActivityForResult(Activity.java:)

这是由于Android7.0执行了“StrictModeAPI政策禁”的原因,不过小伙伴们不用担心,上文讲到了可以用FileProvider来解决这一问题,现在我们就来一步一步的解决这个问题。

使用FileProvider

使用FileProvider的大致步骤如下:

第一步:在manifest清单文件中注册provider

providerandroid:name="android.support.v4.content.FileProvider"android:authorities="







































北京哪家医院白癜风手术最好
专门治疗白癜风的医院



转载请注明:http://www.gslnbdf.com/azrj/2941.html

  • 上一篇文章:
  •   
  • 下一篇文章: