Android7.0適配

Android7.0發(fā)布已經(jīng)有一個(gè)多月了,Android7.0在給用戶帶來一些新的特性的同時(shí)理张,也給開發(fā)者帶來了新的挑戰(zhàn)忿族,這幾天我將應(yīng)用適配到Android7.0抖锥,其中也遇到了不少問題也踩了一些坑硼砰,在這里就把我在Android7.0適配上的一些心得分享給大家,讓大家的應(yīng)用能早一天跑在Android7.0上蜡娶。


權(quán)限更改

隨著Android版本越來越高混卵,Android對(duì)隱私的保護(hù)力度也越來越大。從Android6.0引入的動(dòng)態(tài)權(quán)限控制(Runtime Permissions)到Android7.0的“私有目錄被限制訪問”窖张,“StrictMode API 政策”幕随。這些更改在為用戶帶來更加安全的操作系統(tǒng)的同時(shí)也為開發(fā)者帶來了一些新的任務(wù)。如何讓你的APP能夠適應(yīng)這些改變而不是cash宿接,是擺在每一位Android開發(fā)者身上的責(zé)任赘淮。


目錄被限制訪問

一直以來,在目錄及文件的訪問保護(hù)方面iOS做的是很到位的澄阳,如:iOS的沙箱機(jī)制拥知。但,Android在這方面的保護(hù)就有些偏弱了碎赢,在Android中應(yīng)用可以讀寫手機(jī)存儲(chǔ)中任何一個(gè)目錄及文件低剔,這也帶來了很多的安全問題。現(xiàn)在Android也在著力解決這一問題肮塞。


在Android7.0中為了提高私有文件的安全性襟齿,面向 Android N 或更高版本的應(yīng)用私有目錄將被限制訪問。對(duì)于這個(gè)權(quán)限的更改開發(fā)者需要留意一下改變:?

私有文件的文件權(quán)限不在放權(quán)給所有的應(yīng)用枕赵,使用 MODE_WORLD_READABLE MODE_WORLD_WRITEABLE 進(jìn)行的操作將觸發(fā) SecurityException猜欺。

應(yīng)對(duì)策略:這項(xiàng)權(quán)限的變更將意味著你無法通過File API訪問手機(jī)存儲(chǔ)上的數(shù)據(jù)了,基于File API的一些文件瀏覽器等也將受到很大的影響拷窜,看到這大家是不是驚呆了呢开皿,不過迄今為止,這種限制尚不能完全執(zhí)行篮昧。 應(yīng)用仍可能使用原生 API 或 File API 來修改它們的私有目錄權(quán)限赋荆。 但是,Android官方強(qiáng)烈反對(duì)放寬私有目錄的權(quán)限懊昨≌叮可以看出收起對(duì)私有文件的訪問權(quán)限是Android將來發(fā)展的趨勢(shì)。

給其他應(yīng)用傳遞 file:// URI 類型的Uri酵颁,可能會(huì)導(dǎo)致接受者無法訪問該路徑嫉你。 因此月帝,在Android7.0中嘗試傳遞 file:// URI 會(huì)觸發(fā) FileUriExposedException。?

應(yīng)對(duì)策略:大家可以通過使用FileProvider來解決這一問題幽污。


DownloadManager 不再按文件名分享私人存儲(chǔ)的文件嚷辅。COLUMN_LOCAL_FILENAME在Android7.0中被標(biāo)記為deprecated ,舊版應(yīng)用在訪問 COLUMN_LOCAL_FILENAME時(shí)可能出現(xiàn)無法訪問的路徑油挥。 面向 Android N 或更高版本的應(yīng)用在嘗試訪問 COLUMN_LOCAL_FILENAME 時(shí)會(huì)觸發(fā) SecurityException潦蝇。?

?應(yīng)對(duì)策略:大家可以通過ContentResolver.openFileDescriptor()來訪?問由DownloadManager? 公開的文件款熬。


應(yīng)用間共享文件

在Android7.0系統(tǒng)上深寥,Android 框架強(qiáng)制執(zhí)行了 StrictMode API 政策禁止向你的應(yīng)用外公開 file:// URI。 如果一項(xiàng)包含文件 file:// URI類型 的 Intent 離開你的應(yīng)用贤牛,應(yīng)用失敗惋鹅,并出現(xiàn) FileUriExposedException 異常,如調(diào)用系統(tǒng)相機(jī)拍照殉簸,或裁切照片闰集。

應(yīng)對(duì)策略:若要在應(yīng)用間共享文件,可以發(fā)送 content:// URI類型的Uri般卑,并授予 URI 臨時(shí)訪問權(quán)限武鲁。 進(jìn)行此授權(quán)的最簡(jiǎn)單方式是使用 FileProvider類。 如需有關(guān)權(quán)限和共享文件的更多信息蝠检,請(qǐng)參閱共享文件沐鼠。


在Android7.0上調(diào)用系統(tǒng)相機(jī)拍照,裁切照片
調(diào)用系統(tǒng)相機(jī)拍照

在Android7.0之前叹谁,如果你想調(diào)用系統(tǒng)相機(jī)拍照可以通過以下代碼來進(jìn)行:??


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);//設(shè)置Action為拍照
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//將拍取的照片保存到指定URI
startActivityForResult(intent,1006);

在Android7.0上使用上述方式調(diào)用系統(tǒng)相拍照會(huì)拋出如下異常:


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)


這是由于Android7.0執(zhí)行了“StrictMode API 政策禁”的原因饲梭,不過小伙伴們不用擔(dān)心,上文講到了可以用FileProvider來解決這一問題焰檩,現(xiàn)在我們就來一步一步的解決這個(gè)問題憔涉。?

使用FileProvider

使用FileProvider的大致步驟如下:

第一步:在manifest清單文件中注冊(cè)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則會(huì)報(bào)安全異常析苫。grantUriPermissions:true兜叨,表示授予 URI 臨時(shí)訪問權(quán)限。


第二步:指定共享的目錄
為了指定共享的目錄我們需要在資源(res)目錄下創(chuàng)建一個(gè)xml目錄衩侥,然后創(chuàng)建一個(gè)名為“file_paths”(名字可以隨便起国旷,只要和在manifest注冊(cè)的provider所引用的resource保持一致即可)的資源文件,內(nèi)容如下:


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

●<files-path/>代表的根目錄: Context.getFilesDir()
●<external-path/>代表的根目錄: Environment.getExternalStorageDirectory()
●<cache-path/>代表的根目錄: getCacheDir()

心得:上述代碼中path=""顿乒,是有特殊意義的议街,它代碼根目錄,也就是說你可以向其它的應(yīng)用共享根目錄及其子目錄下任何一個(gè)文件了璧榄,如果你將path設(shè)為path="pictures"特漩,那么它代表著根目錄下的pictures目錄(eg:/storage/emulated/0/pictures)吧雹,如果你向其它應(yīng)用分享pictures目錄范圍之外的文件是不行的。


第三步:使用FileProvider
上述準(zhǔn)備工作做完之后涂身,現(xiàn)在我們就可以使用FileProvider了雄卷。還是以調(diào)用系統(tǒng)相機(jī)拍照為例,我們需要將上述拍照代碼修改為如下:??


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創(chuàng)建一個(gè)content類型的Uri
Intent intent = new Intent();
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加這一句表示對(duì)目標(biāo)應(yīng)用臨時(shí)授權(quán)該Uri所代表的文件
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//設(shè)置Action為拍照
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//將拍取的照片保存到指定URI
startActivityForResult(intent,1006);


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

1.將之前Uri的scheme類型為file的Uri改成了有FileProvider創(chuàng)建一個(gè)content類型的Uri蛤售。??
2.添加了intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);來對(duì)目標(biāo)應(yīng)用臨時(shí)授權(quán)該Uri所代表的文件丁鹉。

心得:上述代碼通過FileProvider的Uri getUriForFile (Context context, String authority, File file)靜態(tài)方法來獲取Uri,該方法中authority參數(shù)就是清單文件中注冊(cè)provider的android:authorities="com.jph.takephoto.fileprovider"悴能。對(duì)Web服務(wù)器如tomcat揣钦,IIS比較熟悉的小伙伴,都只知道為了網(wǎng)站內(nèi)容的安全和高效漠酿,Web服務(wù)器都支持為網(wǎng)站內(nèi)容設(shè)置一個(gè)虛擬目錄冯凹,其實(shí)FileProvider也有異曲同工之處。


將getUriForFile方法獲取的Uri打印出來如下:?


content://com.jph.takephoto.fileprovider/camera_photos/temp/1474960080319.jpg`炒嘲。


其中camera_photos就是file_paths.xml中paths的name宇姚。


因?yàn)樯鲜鲋付ǖ膒ath為path="",所以content://com.jph.takephoto.fileprovider/camera_photos/代表的真實(shí)路徑就是根目錄夫凸,即:/storage/emulated/0/浑劳。content://com.jph.takephoto.fileprovider/camera_photos/temp/1474960080319.jpg代表的真實(shí)路徑是:/storage/emulated/0/temp/1474960080319.jpg。??


另外夭拌,推薦大家使用開源工具庫TakePhoto魔熏,TakePhoto是一款在Android設(shè)備上獲取照片(拍照或從相冊(cè)、文件中選擇)啼止、裁剪圖片道逗、壓縮圖片的開源工具庫。


裁切照片

在Android7.0之前献烦,你可以通過如下方法來裁切照片:?

?
File file=new File(Environment.getExternalStorageDirectory(), "/temp/"+System.currentTimeMillis() + ".jpg");
if (!file.getParentFile().exists())file.getParentFile().mkdirs();
Uri outputUri = Uri.fromFile(file);
Uri imageUri=Uri.fromFile(new File("/storage/emulated/0/temp/1474960080319.jpg"));
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent,1008);


和拍照一樣滓窍,上述代碼在Android7.0上同樣會(huì)引起android.os.FileUriExposedException異常,解決辦法就是上文說說的使用FileProvider巩那。?
然后吏夯,將上述代碼改為如下即可:??


File file=new File(Environment.getExternalStorageDirectory(), "/temp/"+System.currentTimeMillis() + ".jpg");
if (!file.getParentFile().exists())file.getParentFile().mkdirs();
Uri outputUri = FileProvider.getUriForFile(context, "com.jph.takephoto.fileprovider",file);
Uri imageUri=FileProvider.getUriForFile(context, "com.jph.takephoto.fileprovider", new File("/storage/emulated/0/temp/1474960080319.jpg");//通過FileProvider創(chuàng)建一個(gè)content類型的Uri
Intent intent = new Intent("com.android.camera.action.CROP");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(imageUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("scale", true);
intent.putExtra(MediaStore.EXTRA_OUTPUT, outputUri);
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent,1008);


另外,裁切照片推薦大家使用開源工具庫TakePhoto即横,TakePhoto是一款在Android設(shè)備上獲取照片(拍照或從相冊(cè)噪生、文件中選擇)、裁剪圖片东囚、壓縮圖片的開源工具庫跺嗽。


電池和內(nèi)存

Android 6.0(API 級(jí)別 23)引入了低電耗模式,Android7.0在電池和內(nèi)存上又做了進(jìn)一步優(yōu)化,來減少Android應(yīng)用對(duì)電量的消耗以及對(duì)內(nèi)存的占用桨嫁。這些優(yōu)化所帶來的一些規(guī)則的變更可能會(huì)影響你的應(yīng)用訪問系統(tǒng)資源植兰,以及你的系統(tǒng)通過特定隱式 Intent 與其他應(yīng)用互動(dòng)的方式。所以開發(fā)人員需要特別注意這些改變璃吧。


低電耗模式

在低電耗模式下楣导,當(dāng)用戶設(shè)備未插接電源、處于靜止?fàn)顟B(tài)且屏幕關(guān)閉時(shí)畜挨,該模式會(huì)推遲 CPU 和網(wǎng)絡(luò)活動(dòng)筒繁,從而延長(zhǎng)電池壽命。Android7.0通過在設(shè)備未插接電源且屏幕關(guān)閉狀態(tài)下巴元、但不一定要處于靜止?fàn)顟B(tài)(例如用戶外出時(shí)把手持式設(shè)備裝在口袋里)時(shí)應(yīng)用部分 CPU 和網(wǎng)絡(luò)限制毡咏,進(jìn)一步增強(qiáng)了低電耗模式。


也就是說务冕,Android7.0會(huì)在手機(jī)屏幕關(guān)閉的狀態(tài)下血当,限時(shí)應(yīng)用對(duì)CPU以及網(wǎng)絡(luò)的使用。


具體規(guī)則如下:?

1.當(dāng)設(shè)備處于充電狀態(tài)且屏幕已關(guān)閉一定時(shí)間后禀忆,設(shè)備會(huì)進(jìn)入低電耗模式并應(yīng)用第一部分限制: 關(guān)閉應(yīng)用網(wǎng)絡(luò)訪問、推遲作業(yè)和同步落恼。
2.如果進(jìn)入低電耗模式后設(shè)備處于靜止?fàn)顟B(tài)達(dá)到一定時(shí)間箩退,系統(tǒng)則會(huì)對(duì) PowerManager.WakeLockAlarmManager鬧鈴佳谦、GPS 和 Wi-Fi 掃描應(yīng)用余下的低電耗模式限制戴涝。 無論是應(yīng)用部分還是全部低電耗模式限制,系統(tǒng)都會(huì)喚醒設(shè)備以提供簡(jiǎn)短的維護(hù)時(shí)間窗口钻蔑,在此窗口期間啥刻,應(yīng)用程序可以訪問網(wǎng)絡(luò)并執(zhí)行任何被推遲的作業(yè)/同步。

后臺(tái)優(yōu)化

小伙伴們都知道在Android中有一些隱式廣播咪笑,使用這些隱式廣播可以做一些特定的功能可帽,如,當(dāng)手機(jī)網(wǎng)絡(luò)變成WiFi時(shí)自動(dòng)下載更新包等窗怒。但映跟,這些隱式廣播會(huì)在后臺(tái)頻繁啟動(dòng)已注冊(cè)偵聽這些廣播的應(yīng)用,從而帶來很大的電量消耗扬虚,為緩解這一問題來提升設(shè)備性能和用戶體驗(yàn)努隙,在Android 7.0中刪除了三項(xiàng)隱式廣播,以幫助優(yōu)化內(nèi)存使用和電量消耗辜昵。


Android 7.0 應(yīng)用了以下優(yōu)化措施:

●在 Android 7.0上 應(yīng)用不會(huì)收到 CONNECTIVITY_ACTION 廣播荸镊,即使你在manifest清單文件中設(shè)置了請(qǐng)求接受這些事件的通知。 但,在前臺(tái)運(yùn)行的應(yīng)用如果使用BroadcastReceiver 請(qǐng)求接收通知躬存,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE收厨。
●在 Android 7.0上應(yīng)用無法發(fā)送或接收 ACTION_NEW_PICTURE 或ACTION_NEW_VIDEO 類型的廣播。

應(yīng)對(duì)策略:Android 框架提供多個(gè)解決方案來緩解對(duì)這些隱式廣播的需求优构。 例如诵叁,JobScheduler API提供了一個(gè)穩(wěn)健可靠的機(jī)制來安排滿足指定條件(例如連入無限流量網(wǎng)絡(luò))時(shí)所執(zhí)行的網(wǎng)絡(luò)操作。 您甚至可以使用 JobScheduler API 來適應(yīng)內(nèi)容提供程序變化钦椭。


另外拧额,大家如果想了解更多關(guān)于后臺(tái)的優(yōu)化可查閱后臺(tái)優(yōu)化


移動(dòng)設(shè)備會(huì)經(jīng)歷頻繁的連接變更彪腔,例如在 Wi-Fi 和移動(dòng)數(shù)據(jù)之間切換時(shí)侥锦。 目前,可以通過在應(yīng)用清單中注冊(cè)一個(gè)接收器來偵聽隱式 CONNECTIVITY_ACTION 廣播德挣,讓應(yīng)用能夠監(jiān)控這些變更恭垦。 由于很多應(yīng)用會(huì)注冊(cè)接收此廣播,因此單次網(wǎng)絡(luò)切換即會(huì)導(dǎo)致所有應(yīng)用被喚醒并同時(shí)處理此廣播格嗅。
以上是番挺,我在Android7.0上適配上的一些心得,小伙伴們?nèi)绻杏龅絾栴}可以在下方留言屯掖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玄柏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贴铜,更是在濱河造成了極大的恐慌粪摘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绍坝,死亡現(xiàn)場(chǎng)離奇詭異徘意,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)轩褐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門椎咧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人灾挨,你說我怎么就攤上這事邑退。” “怎么了劳澄?”我有些...
    開封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵地技,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我秒拔,道長(zhǎng)莫矗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮作谚,結(jié)果婚禮上三娩,老公的妹妹穿的比我還像新娘。我一直安慰自己妹懒,他們只是感情好雀监,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著眨唬,像睡著了一般会前。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上匾竿,一...
    開封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天瓦宜,我揣著相機(jī)與錄音,去河邊找鬼岭妖。 笑死临庇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的昵慌。 我是一名探鬼主播假夺,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼废离!你這毒婦竟也來了侄泽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蜻韭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后柿扣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肖方,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年未状,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俯画。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡司草,死狀恐怖艰垂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情埋虹,我是刑警寧澤猜憎,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站搔课,受9級(jí)特大地震影響胰柑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一柬讨、第九天 我趴在偏房一處隱蔽的房頂上張望崩瓤。 院中可真熱鬧,春花似錦踩官、人聲如沸却桶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颖系。三九已至,卻和暖如春蛋逾,著一層夾襖步出監(jiān)牢的瞬間集晚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工区匣, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留偷拔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓亏钩,卻偏偏與公主長(zhǎng)得像莲绰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子姑丑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android7.0發(fā)布已經(jīng)有一個(gè)多月了栅哀,Android7.0在給用戶帶來一些新的特性的同時(shí)震肮,也給開發(fā)者帶來了新的...
    CrazyCodeBoy閱讀 77,308評(píng)論 46 745
  • 從Android6.0引入的動(dòng)態(tài)權(quán)限控制(Runtime Permissions)到Android7.0的“私有目...
    黃海佳閱讀 1,472評(píng)論 0 1
  • Android7.0適配注意事項(xiàng) 權(quán)限更改 Android6.0引入了動(dòng)態(tài)權(quán)限控制(Runtime Permiss...
    littlezan閱讀 1,110評(píng)論 0 3
  • 作者簡(jiǎn)介 原創(chuàng)微信公眾號(hào)郭霖 WeChat ID: guolin_blog 本篇來自Chay_Chan的投稿,分享...
    木木00閱讀 611評(píng)論 0 10
  • 小小的白花 開滿了田野 像無數(shù)的星星 點(diǎn)綴在美麗的夜空中 而我只是靜靜的望著她的美 像你們一樣 微風(fēng)吹拂著她的花瓣...
    李笑然閱讀 598評(píng)論 1 8