天天看點

Android N 7.0特性及适配

一、前言

Android 7.0 Nougat 提供新功能以提升性能、生産效率和安全性。主要新增了一些特性和優化。

關于Android 7.0特性的介紹,網上有很多不錯的部落格,比如-> https://blog.csdn.net/wulianghuan/article/details/59112049

在此,就不詳細列舉,僅做自我總結一下,重點在适配上,便于日後查閱。

二、幾個重要特性

1、通知

Android N 增加了許多新的notifications API,進行了重新的設計,引入了新的風格。

2、多視窗支援(分屏模式)。

手機和平闆使用者可以并排運作兩個應用。

3、随時随地低電耗模式

在 Android N 中,低電耗模式又前進了一步,随時随地可以省電。隻要螢幕關閉了一段時間,且裝置未插入電源,低電耗模式就會對應用使用熟悉的 CPU 和網絡限制

4、快速的應用安裝路徑

Android 運作元件的 JIT 編譯器最實際的好處之一是應用安裝和系統更新的速度。即使在Android 6.0 中需要幾分鐘進行優化和安裝的大型應用,現在隻需幾秒鐘就可以完成安裝。

5、Project Svelte:背景優化

Android N 删除了三項隐式廣播 CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO ,以幫助優化記憶體使用和電量消耗。

6、Data Saver

Android N推出了Data Saver模式,這是一項新的系統服務,有助于減少應用使用的蜂窩資料,無論是在漫遊,賬單周期即将結束,還是使用少量的預付費資料包。

7、号碼屏蔽

Android N 現在支援在平台中進行号碼屏蔽,提供架構 API,讓服務提供商可以維護屏蔽的号碼清單。預設短信應用、預設手機應用和提供商應用可以對屏蔽的号碼清單進行讀取和寫入操作,其他應用則無法通路此清單。

8、密鑰認證

為了讓硬體支援的密鑰庫使用起來更簡單和更安全,Android N 引入了密鑰認證。應用和關閉的裝置可使用密鑰認證以堅決地确定 RSA 或 EC 密鑰對是否受硬體支援、密鑰對的屬性如何,以及其使用和有效性有何限制。

三、Android N 适配

1、檔案通路權限

随着Android版本越來越高,Android對隐私的保護力度也越來越大。Android 6.0引入了動态權限控制,Android 7.0則“限制通路應用私有目錄”。 

最大的影響就是檔案共享不能再使用file://這樣的uri去分享通路了,會報FileUriExposedException錯誤。是以,官方提供了新的類--FileProvider 來解決此問題

主要影響場景功能:1)拍照功能,裁剪圖檔  2)點選通知欄安裝APP無反應

FileProvider 使用步驟:

1)在manifest清單檔案中注冊provider

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.jph.takephoto.fileprovider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_paths" />
</provider>
           

exported:要求必須為false,為true則會報安全異常。grantUriPermissions:true,表示授予 URI 臨時通路權限。

2)指定共享的目錄

為了指定共享的目錄我們需要在資源(res)目錄下建立一個xml目錄,然後建立一個名為“file_paths”(名字可以随便起,隻要和在manifest注冊的provider所引用的resource保持一緻即可)的資源檔案

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path path="" name="camera_photos" />
    </paths>
</resources>
           

上述代碼中path=”“,是有特殊意義的,它代碼根目錄,也就是說你可以向其它的應用共享根目錄及其子目錄下任何一個檔案了,如果你将path設為path=”pictures”, 

那麼它代表着根目錄下的pictures目錄(eg:/storage/emulated/0/pictures),如果你向其它應用分享pictures目錄範圍之外的檔案是不行的。

3)使用FileProvider 

以調用系統相機拍照為例,

在Android7.0之前,如果你想調用系統相機拍照可以通過以下代碼來進行

File file=new File(Environment.getExternalStorageDirectory(), "/temp/"+System.currentTimeMillis() + ".jpg");
if (!file.getParentFile().exists())file.getParentFile().mkdirs();
Uri imageUri = Uri.fromFile(file);
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//設定Action為拍照
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片儲存到指定URI
startActivityForResult(intent,1006);
           

 在Android7.0上使用上述方式調用系統相拍照會抛出如下異常:

android.os.FileUriExposedException: file:storage/emulated/0/temp/1474956193735.jpg exposed beyond app through Intent.getData()
at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
at android.net.Uri.checkFileUriExposed(Uri.java:2346)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8933)
at android.content.Intent.prepareToLeaveProcess(Intent.java:8894)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
at android.app.Activity.startActivityForResult(Activity.java:4223)
...
at android.app.Activity.startActivityForResult(Activity.java:4182)
           

在Android N上,使用FileProvider适配:

File file=new File(Environment.getExternalStorageDirectory(), "/temp/"+System.currentTimeMillis() + ".jpg");
if (!file.getParentFile().exists())file.getParentFile().mkdirs();
Uri imageUri = FileProvider.getUriForFile(context, "com.jph.takephoto.fileprovider", file);//通過FileProvider建立一個content類型的Uri
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加這一句表示對目标應用臨時授權該Uri所代表的檔案
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//設定Action為拍照
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片儲存到指定URI
startActivityForResult(intent,1006);
           

上述代碼中主要有兩處改變:

1、将之前Uri的scheme類型為file的Uri改成了有FileProvider建立一個content類型的Uri。 

2、添加了intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);來對目标應用臨時授權該Uri所代表的檔案。

2、v2簽名問題

Android 7.0引入了全新的 APK Signature Scheme v2。這是加強對包的校驗,啟動了新的簽名後,有時候打包會在7.0機器上報錯,解決方法是:在gradle上配置一下,關閉v2簽名,在signingConfigs中增加關閉配置。

signingConfigs {
      release {
        .......
        v2SigningEnabled false
      }
    }
           

本文内容轉自:

https://blog.csdn.net/wulianghuan/article/details/59112049

https://blog.csdn.net/qq_35100676/article/details/70670172

感謝!

繼續閱讀