Android7.0適配心得

從Android6.0引入的動態(tài)權(quán)限控制(Runtime Permissions)到Android7.0的“私有目錄被限制訪問”怕午,“StrictMode API 政策”览芳。隨著Android版本越來越高泌射,Android對隱私的保護力度也越來越大椿浓。下面總結(jié)一下適配心得贞铣。

Paste_Image.png
如果沒有做好兼容在應(yīng)用市場會出現(xiàn)如下提示

安裝的時候提示不兼容Android7.0

原因:谷歌權(quán)限變化掌桩,應(yīng)用加固

安裝的時候提示不兼容Android7.0

一、目錄被限制訪問

一直以來矾麻,在目錄及文件的訪問保護方面iOS做的是很到位的纱耻,如:iOS的沙箱機制。但险耀,Android在這方面的保護就有些偏弱了弄喘,在Android中應(yīng)用可以讀寫手機存儲中任何一個目錄及文件,這也帶來了很多的安全問題∷ξ現(xiàn)在Android也在著力解決這一問題蘑志。

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

私有文件的文件權(quán)限不在放權(quán)給所有的應(yīng)用急但,使用 MODE_WORLD_READABLEMODE_WORLD_WRITEABLE 進行的操作將觸發(fā) SecurityException。

應(yīng)對策略:這項權(quán)限的變更將意味著你無法通過File API訪問手機存儲上的數(shù)據(jù)了搞乏,基于File API的一些文件瀏覽器等也將受到很大的影響波桩,看到這大家是不是驚呆了呢,不過迄今為止请敦,這種限制尚不能完全執(zhí)行镐躲。 應(yīng)用仍可能使用原生 API 或 File API 來修改它們的私有目錄權(quán)限储玫。 但是,Android官方強烈反對放寬私有目錄的權(quán)限萤皂∪銮睿可以看出收起對私有文件的訪問權(quán)限是Android將來發(fā)展的趨勢。

(一)敌蚜、給其他應(yīng)用傳遞 file

給其他應(yīng)用傳遞 file:// URI 類型的Uri桥滨,可能會導致接受者無法訪問該路徑。 因此弛车,在Android7.0中嘗試傳遞 file:// URI 會觸發(fā) FileUriExposedException齐媒。

應(yīng)對策略:大家可以通過使用FileProvider來解決這一問題。
例子:N 上 安裝Apk時報錯:android.os.FileUriExposedException: file:///storage/emulated/0/Download/appName-2.3.0.apk exposed beyond app through Intent.getData()

(二)纷跛、DownloadManager

DownloadManager 不再按文件名分享私人存儲的文件喻括。COLUMN_LOCAL_FILENAME在Android7.0中被標記為deprecated
,舊版應(yīng)用在訪問 COLUMN_LOCAL_FILENAME時可能出現(xiàn)無法訪問的路徑贫奠。 面向 Android N 或更高版本的應(yīng)用在嘗試訪問 COLUMN_LOCAL_FILENAME 時會觸發(fā) SecurityException唬血。

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

(三)唤崭、應(yīng)用間共享文件

在Android7.0系統(tǒng)上拷恨,Android 框架強制執(zhí)行了 StrictMode API 政策禁止向你的應(yīng)用外公開 file:// URI。 如果一項包含文件 file:// URI類型 的 Intent 離開你的應(yīng)用谢肾,應(yīng)用失敗腕侄,并出現(xiàn) FileUriExposedException 異常,如調(diào)用系統(tǒng)相機拍照芦疏,或裁切照片冕杠。

應(yīng)對策略:若要在應(yīng)用間共享文件,可以發(fā)送 content:// URI類型的Uri酸茴,并授予 URI 臨時訪問權(quán)限分预。 進行此授權(quán)的最簡單方式是使用 FileProvider類。 如需有關(guān)權(quán)限和共享文件的更多信息薪捍,請參閱共享文件笼痹。

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

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

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)相拍照會拋出如下異常:

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)
Paste_Image.png

這是由于Android7.0執(zhí)行了“StrictMode API 政策禁”的原因,不過小伙伴們不用擔心昆稿,上文講到了可以用FileProvider來解決這一問題,現(xiàn)在我們就來一步一步的解決這個問題息拜。

使用FileProvider

使用FileProvider的大致步驟如下:

第一步:在manifest清單文件中注冊provider
<provider
    android:name="android.support.v4.content.FileProvider"
    // android:authorities="app的包名.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>

注意:
authorities:app的包名.fileProvider
exported:要求必須為false溉潭,為true則會報安全異常净响。
grantUriPermissions:必須是true,表示授予 URI 臨時訪問權(quán)限喳瓣。
resource:中的@xml/file_paths是我們接下來要添加的文件

第二步:指定共享的目錄

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

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <paths>
        <external-path path="" name="camera_photos" />
    </paths>
</resources>
<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path path="Android/data/app的包名/" name="files_root" />
    <external-path path="." name="external_storage_root" />
</paths>
  • <files-path/>代表的根目錄: Context.getFilesDir()
  • <external-path/>代表的根目錄: Environment.getExternalStorageDirectory()
  • <cache-path/>代表的根目錄: getCacheDir()

心得:上述代碼中path=""配乓,是有特殊意義的,它代碼根目錄惠毁,也就是說你可以向其它的應(yīng)用共享根目錄及其子目錄下任何一個文件了犹芹,如果你將path設(shè)為path="pictures",
那么它代表著根目錄下的pictures目錄(eg:/storage/emulated/0/pictures)鞠绰,如果你向其它應(yīng)用分享pictures目錄范圍之外的文件是不行的腰埂。

第三步:使用FileProvider

上述準備工作做完之后,現(xiàn)在我們就可以使用FileProvider了蜈膨。
還是以調(diào)用系統(tǒng)相機拍照為例屿笼,我們需要將上述拍照代碼修改為如下:

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

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

  • 將之前Uri的scheme類型為file的Uri改成了有FileProvider創(chuàng)建一個content類型的Uri。
  • 添加了intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);來對目標應(yīng)用臨時授權(quán)該Uri所代表的文件翁巍。

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

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

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

其中camera_photos就是file_paths.xml中paths的name洒嗤。
因為上述指定的path為path=""箫荡,所以content://com.jph.takephoto.fileprovider/camera_photos/代表的真實路徑就是根目錄,即:/storage/emulated/0/渔隶。
content://com.jph.takephoto.fileprovider/camera_photos/temp/1474960080319.jpg代表的真實路徑是:/storage/emulated/0/temp/1474960080319.jpg羔挡。

另外,推薦大家使用開源工具庫TakePhoto间唉,TakePhoto是一款在Android設(shè)備上獲取照片(拍照或從相冊绞灼、文件中選擇)、裁剪圖片呈野、壓縮圖片的開源工具庫低矮。
裁切照片

在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上同樣會引起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)建一個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è)備上獲取照片(拍照或從相冊、文件中選擇)终议、裁剪圖片汇竭、壓縮圖片的開源工具庫。
(五)穴张、電池和內(nèi)存

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

低電耗模式

在低電耗模式下击狮,當用戶設(shè)備未插接電源、處于靜止狀態(tài)且屏幕關(guān)閉時益老,該模式會推遲 CPU 和網(wǎng)絡(luò)活動彪蓬,從而延長電池壽命。
Android7.0通過在設(shè)備未插接電源且屏幕關(guān)閉狀態(tài)下捺萌、但不一定要處于靜止狀態(tài)(例如用戶外出時把手持式設(shè)備裝在口袋里)時應(yīng)用部分 CPU 和網(wǎng)絡(luò)限制档冬,進一步增強了低電耗模式活孩。

也就是說葬项,Android7.0會在手機屏幕關(guān)閉的狀態(tài)下衣迷,限時應(yīng)用對CPU以及網(wǎng)絡(luò)的使用揖闸。

具體規(guī)則如下:
  • 當設(shè)備處于充電狀態(tài)且屏幕已關(guān)閉一定時間后,設(shè)備會進入低電耗模式并應(yīng)用第一部分限制: 關(guān)閉應(yīng)用網(wǎng)絡(luò)訪問脚乡、推遲作業(yè)和同步哥蔚。
  • 如果進入低電耗模式后設(shè)備處于靜止狀態(tài)達到一定時間姑隅,系統(tǒng)則會對PowerManager.WakeLock伞梯、AlarmManager鬧鈴玫氢、GPS 和 Wi-Fi 掃描應(yīng)用余下的低電耗模式限制。 無論是應(yīng)用部分還是全部低電耗模式限制谜诫,系統(tǒng)都會喚醒設(shè)備以提供簡短的維護時間窗口漾峡,在此窗口期間,應(yīng)用程序可以訪問網(wǎng)絡(luò)并執(zhí)行任何被推遲的作業(yè)/同步喻旷。
后臺優(yōu)化

小伙伴們都知道在Android中有一些隱式廣播生逸,使用這些隱式廣播可以做一些特定的功能,如,當手機網(wǎng)絡(luò)變成WiFi時自動下載更新包等槽袄。
但伟阔,這些隱式廣播會在后臺頻繁啟動已注冊偵聽這些廣播的應(yīng)用,從而帶來很大的電量消耗掰伸,為緩解這一問題來提升設(shè)備性能和用戶體驗,在Android 7.0中刪除了三項隱式廣播怀估,以幫助優(yōu)化內(nèi)存使用和電量消耗狮鸭。

Android 7.0 應(yīng)用了以下優(yōu)化措施:
  • 在 Android 7.0上 應(yīng)用不會收到 CONNECTIVITY_ACTION 廣播,即使你在manifest清單文件中設(shè)置了請求接受這些事件的通知多搀。 但歧蕉,在前臺運行的應(yīng)用如果使用BroadcastReceiver 請求接收通知,則仍可以在主線程中偵聽 CONNECTIVITY_CHANGE康铭。
  • 在 Android 7.0上應(yīng)用無法發(fā)送或接收 ACTION_NEW_PICTURE 或ACTION_NEW_VIDEO 類型的廣播惯退。

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

另外夷野,大家如果想了解更多關(guān)于后臺的優(yōu)化可查閱后臺優(yōu)化懊蒸。

移動設(shè)備會經(jīng)歷頻繁的連接變更,例如在 Wi-Fi 和移動數(shù)據(jù)之間切換時悯搔。 目前骑丸,可以通過在應(yīng)用清單中注冊一個接收器來偵聽隱式 CONNECTIVITY_ACTION 廣播,
讓應(yīng)用能夠監(jiān)控這些變更妒貌。 由于很多應(yīng)用會注冊接收此廣播通危,因此單次網(wǎng)絡(luò)切換即會導致所有應(yīng)用被喚醒并同時處理此廣播。

Paste_Image.png
另外權(quán)限處理框架PermissionsDispatcher的使用

使用這個框架最好先安裝PermissionsDispatcher plugin灌曙,方便直接使用

1菊碟、引入依賴

添加

compile 'com.github.hotchemi:permissionsdispatcher:3.0.1'
annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:3.0.1'

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:design:26.1.0'
    testImplementation 'junit:junit:4.12'

    //這行代碼是編譯后自動生成--start
    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    //這行代碼是編譯后自動生成--end

    compile 'com.github.hotchemi:permissionsdispatcher:3.0.1'
    annotationProcessor 'com.github.hotchemi:permissionsdispatcher-processor:3.0.1'
}

這幾行代碼是編譯后自己生成,不用手動寫

 androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })

在需要權(quán)限校驗用到的地方

MainActivityPermissionsDispatcher.showContactsWithCheck(this);

MainActivityPermissionsDispatcher在編譯后自動生成平匈,編譯方法如下


參考

Android N系列適配---FileProvider
Android7.0適配教程框沟,心得
Android 7.0 開發(fā)者版本
android6.0,7.0獲取真實的藍牙地址
Android N(7.0) 被美翻的新特性!
Android 7.0 Nougat正式版刷機教程—nexus5X
http://www.apkbus.com/blog-705730-62835.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末增炭,一起剝皮案震驚了整個濱河市忍燥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隙姿,老刑警劉巖梅垄,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡队丝,警方通過查閱死者的電腦和手機靡馁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來机久,“玉大人臭墨,你說我怎么就攤上這事”旄牵” “怎么了胧弛?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侠畔。 經(jīng)常有香客問我结缚,道長,這世上最難降的妖魔是什么软棺? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任红竭,我火速辦了婚禮,結(jié)果婚禮上喘落,老公的妹妹穿的比我還像新娘茵宪。我一直安慰自己,他們只是感情好瘦棋,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布眉厨。 她就那樣靜靜地躺著,像睡著了一般兽狭。 火紅的嫁衣襯著肌膚如雪憾股。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天箕慧,我揣著相機與錄音服球,去河邊找鬼。 笑死颠焦,一個胖子當著我的面吹牛斩熊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伐庭,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼粉渠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了圾另?” 一聲冷哼從身側(cè)響起霸株,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎集乔,沒想到半個月后去件,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年尤溜,在試婚紗的時候發(fā)現(xiàn)自己被綠了倔叼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡宫莱,死狀恐怖丈攒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情授霸,我是刑警寧澤肥印,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站绝葡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腹鹉。R本人自食惡果不足惜藏畅,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望功咒。 院中可真熱鬧愉阎,春花似錦、人聲如沸力奋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽景殷。三九已至溅呢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猿挚,已是汗流浹背咐旧。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绩蜻,地道東北人铣墨。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像办绝,于是被迫代替她去往敵國和親伊约。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,516評論 25 707
  • Android7.0發(fā)布已經(jīng)有一個多月了孕蝉,Android7.0在給用戶帶來一些新的特性的同時屡律,也給開發(fā)者帶來了新的...
    東經(jīng)315度閱讀 1,344評論 0 14
  • Android7.0發(fā)布已經(jīng)有一個多月了疹尾,Android7.0在給用戶帶來一些新的特性的同時,也給開發(fā)者帶來了新的...
    CrazyCodeBoy閱讀 77,248評論 46 745
  • 云兒空中飛,魚兒水中游纳本。粉紅色的紗裙窍蓝,在陽光的照射下,于樹林間旋轉(zhuǎn)繁成、旋轉(zhuǎn)吓笙。花兒向她微笑巾腕,草兒對他彎腰面睛。藍色的領(lǐng)帶,...
    泥匿閱讀 303評論 0 0
  • J叔漫畫,擅談星座佛寿。 有些人真的就是一句話馬上冷場幌墓。 簡直比聽冷笑話還冷。 白羊座的耿直也真的不是一般的直接冀泻, 最...
    J叔說星座閱讀 288評論 0 0