0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一款好用的鴻蒙系統(tǒng)上的權(quán)限請(qǐng)求框架

OpenHarmony技術(shù)社區(qū) ? 來(lái)源:HarmonyOS技術(shù)社區(qū) ? 作者:HarmonyOS技術(shù)社區(qū) ? 2021-12-03 10:10 ? 次閱讀

桃夭是鴻蒙系統(tǒng)上的一款權(quán)限請(qǐng)求框架,對(duì)請(qǐng)求權(quán)限的代碼進(jìn)行高度封裝,極大的簡(jiǎn)化了申請(qǐng)權(quán)限的代碼邏輯,同時(shí)支持在 Ability、FractionAbility、AbilitySlice、Fractiion 里面申請(qǐng)權(quán)限。

建議大家把源碼下載下來(lái)看看:
https://gitee.com/zhongte/TaoYao

申請(qǐng)權(quán)限

申請(qǐng)權(quán)限的一般步驟如下

  • 判斷是否有權(quán)限,如果有權(quán)限,直接進(jìn)行下一步。

  • 如果沒(méi)有權(quán)限,可以彈窗告知用戶(hù)申請(qǐng)權(quán)限的原因。

  • 彈窗告知用戶(hù)后,如果用戶(hù)同意申請(qǐng)權(quán)限,則判斷用戶(hù)是否點(diǎn)擊了不再提醒。

  • 如果用戶(hù)沒(méi)有點(diǎn)擊不再提醒,則開(kāi)始申請(qǐng)權(quán)限。

  • 如果用戶(hù)點(diǎn)擊了不再提醒,則彈窗告知用戶(hù)去設(shè)置頁(yè)面開(kāi)啟權(quán)限,用戶(hù)點(diǎn)擊彈窗后,跳轉(zhuǎn)到設(shè)置頁(yè)面。

  • 重寫(xiě) onRequestPermissionsFromUserResult 方法,判斷用戶(hù)是否授予權(quán)限。

每次申請(qǐng)權(quán)限的時(shí)候,都需要經(jīng)過(guò)以上幾個(gè)步驟,當(dāng)申請(qǐng)的權(quán)限越來(lái)越多,大量的重復(fù)代碼就出現(xiàn)了。

為了減少重復(fù)代碼,我封裝了一個(gè)權(quán)限請(qǐng)求框架,權(quán)限請(qǐng)求框架取名為桃夭。

桃夭的使用方式

如下代碼,先添加依賴(lài),然后你只需要告知權(quán)限請(qǐng)求框架你需要什么權(quán)限,權(quán)限請(qǐng)求框架就會(huì)告知你權(quán)限申請(qǐng)成功還是失敗。

你不需要手動(dòng)判斷是否有權(quán)限,不需要彈窗告知用戶(hù)申請(qǐng)權(quán)限的原因,不需要判斷用戶(hù)是否點(diǎn)擊了不再提醒,不需要跳轉(zhuǎn)設(shè)置頁(yè)面讓用戶(hù)開(kāi)啟權(quán)限,不需要重寫(xiě) onRequestPermissionsFromUserResult 方法。

框架把這些代碼邏輯都給做了,你只需要關(guān)注權(quán)限申請(qǐng)成功還是失敗。申請(qǐng)權(quán)限變得如此之簡(jiǎn)單。

添加依賴(lài):

api'io.gitee.zhongte1.0.1'

申請(qǐng)權(quán)限:

//申請(qǐng)多設(shè)備協(xié)同權(quán)限
EasyPermission.requestPermission(this,EasyPermission.DISTRIBUTED_DATASYNC,newPermissionAction(){
@Override
publicvoidonGranted(Listpermissions){
//權(quán)限申請(qǐng)成功

}

@Override
publicvoidonDenied(Listpermissions){
//權(quán)限申請(qǐng)失敗
}
},SystemPermission.DISTRIBUTED_DATASYNC);

申請(qǐng)權(quán)限的時(shí)候可能會(huì)涉及到兩個(gè)彈窗,一個(gè)彈窗是用來(lái)告知用戶(hù)申請(qǐng)權(quán)限的原因,另一個(gè)彈窗是用來(lái)告知用戶(hù)去設(shè)置頁(yè)面開(kāi)啟權(quán)限。

這兩個(gè)彈窗在不同的應(yīng)用里面可能長(zhǎng)得不一樣,所以這兩個(gè)彈窗并沒(méi)有被封裝到桃夭框架里面,而是需要使用者根據(jù)你的彈窗樣式對(duì)桃夭進(jìn)行二次封裝。

我在源碼里面對(duì)桃夭框架進(jìn)行了二次封裝,大家可以把源碼下載下來(lái),參考下我是如何對(duì)桃夭框架進(jìn)行二次封裝的。二次封裝完成后,就可以愉快的使用上面的代碼申請(qǐng)權(quán)限了。

實(shí)現(xiàn)原理

檢測(cè)申請(qǐng)的權(quán)限是否在配置文件中聲明

申請(qǐng)的權(quán)限必須在配置文件中聲明,否則桃夭會(huì)直接拋異常。如何檢測(cè)申請(qǐng)的權(quán)限是否在配置文件中聲明。

如下代碼,獲取 bundleManager 對(duì)象,通過(guò) bundleManager 對(duì)象獲取應(yīng)用信息,之后就可以獲取應(yīng)用在配置文件中聲明的權(quán)限了。

/**
*獲取在配置文件中聲明的權(quán)限
*
*@paramcontext上下文
*@return在配置文件中聲明的權(quán)限
*/
privateListgetConfigPermissions(Contextcontext){
//獲取bundleManager對(duì)象
IBundleManagerbundleManager=context.getBundleManager();
StringbundleName=context.getBundleName();
try{
//獲取應(yīng)用信息
BundleInfobundleInfo=bundleManager.getBundleInfo(bundleName,IBundleManager.GET_BUNDLE_WITH_REQUESTED_PERMISSION);
//獲取應(yīng)用在配置文件中聲明的權(quán)限
ListreqPermissionDetails=bundleInfo.reqPermissions;
if(reqPermissionDetails==null||reqPermissionDetails.isEmpty()){
thrownewIllegalStateException("請(qǐng)?jiān)谂渲梦募新暶饕暾?qǐng)的權(quán)限");
}
returnreqPermissionDetails;
}catch(RemoteExceptione){
e.printStackTrace();
}
returnnewArrayList<>();
}

獲取到在配置文件中聲明的權(quán)限后,就可以判斷申請(qǐng)的權(quán)限是否在配置文件中了。

/**
*檢查申請(qǐng)的權(quán)限是否在配置文件中聲明
*
*@parampermissions要申請(qǐng)的權(quán)限
*/
privatevoidcheckPermissions(String...permissions){
if(permissions==null||permissions.length==0){
thrownewIllegalArgumentException("請(qǐng)至少申請(qǐng)一個(gè)權(quán)限");
}
//獲取在配置文件中聲明的權(quán)限
mReqPermissions=getConfigPermissions(mOrigin.getContext());
if(mReqPermissions.isEmpty()){
thrownewIllegalStateException("請(qǐng)?jiān)谂渲梦募新暶饕暾?qǐng)的權(quán)限");
}
for(Stringtarget:permissions){
if(!mReqPermissions.contains(target)){
//沒(méi)有在配置中聲明要申請(qǐng)的權(quán)限,直接拋異常
thrownewIllegalStateException(String.format("%1$s權(quán)限沒(méi)有配置文件中聲明",target));
}
}
}

②判斷是否有權(quán)限

檢測(cè)完權(quán)限是否在配置中聲明后,就可以判斷是否有權(quán)限了。這里就是通過(guò)上下文對(duì)象的 verifySelfPermission 方法來(lái)判斷是否有權(quán)限,如果沒(méi)有權(quán)限,可以彈窗告知用戶(hù)申請(qǐng)的原因。

/**
*是否有權(quán)限
*
*@paramcontext
*@parampermissions
*@return
*/
@Override
publicbooleanhasPermission(Contextcontext,Listpermissions){
for(Stringpermission:permissions){
intresult=context.verifySelfPermission(permission);
if(result==IBundleManager.PERMISSION_DENIED){
//沒(méi)有權(quán)限
returnfalse;
}
}
returntrue;
}

③判斷用戶(hù)是否點(diǎn)擊了不再提醒

通過(guò)上下文對(duì)象的 canRequestPermission 方法來(lái)判斷用戶(hù)是否點(diǎn)擊了不再提醒。

/**
*用戶(hù)是否點(diǎn)擊了不在提醒
*
*@parampermission權(quán)限
*@return
*/
@Override
publicbooleancanRequestPermission(Stringpermission){
returnmContext.canRequestPermission(permission);
}

④跳轉(zhuǎn)到設(shè)置頁(yè)面

如果用戶(hù)點(diǎn)擊了不再提醒,則可以跳轉(zhuǎn)到設(shè)置頁(yè)面讓用戶(hù)開(kāi)啟權(quán)限。

/**
*跳轉(zhuǎn)到設(shè)置頁(yè)面
*/
@Override
publicvoidgotoSetting(){
try{
Intentintent=newIntent();
intent.setAction(IntentConstants.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setUri(Uri.parse("package:"+mOrigin.getContext().getBundleName()));
mOrigin.startAbility(intent);
}catch(Exceptione){
e.printStackTrace();
}
}

⑤啟動(dòng)透明的 Ability 申請(qǐng)權(quán)限

如果沒(méi)有權(quán)限,用戶(hù)頁(yè)面沒(méi)有點(diǎn)擊不再提醒,那就可以申請(qǐng)權(quán)限了。為了不讓調(diào)用者重寫(xiě) onRequestPermissionsFromUserResult 方法,桃夭內(nèi)部啟動(dòng)了一個(gè) Ability。

如下代碼:

/**
*開(kāi)啟一個(gè)透明的Ability來(lái)申請(qǐng)權(quán)限,這樣外界就不需要重寫(xiě)onRequestPermissionsFromUserResult方法
*/
publicclassPermissionAbilityextendsAbility{

privatestaticfinalintREQUEST_CODE=0X10;
publicstaticfinalStringKEY_PERMISSION="key_permission";
publicstaticfinalStringKEY_TYPE="key_type";
publicstaticfinalStringSENSITIVE_PERMISSION="sensitive_permission";

@Override
publicvoidonStart(Intentintent){
super.onStart(intent);
getWindow().setTransparent(true);
super.setUIContent(ResourceTable.Layout_ability_permission);
Listpermissions=intent.getSerializableParam(KEY_PERMISSION);
StringpermissionType=intent.getStringParam(KEY_TYPE);
//請(qǐng)求權(quán)限
requestPermissionsFromUser(permissions.toArray(newString[0]),REQUEST_CODE);
}

@Override
publicvoidonRequestPermissionsFromUserResult(intrequestCode,String[]permissions,int[]grantResults){
super.onRequestPermissionsFromUserResult(requestCode,permissions,grantResults);
//權(quán)限的回調(diào)方法
Postman.send(permissions,grantResults);
terminateAbility();
}

@Override
protectedvoidonAbilityResult(intrequestCode,intresultCode,IntentresultData){
super.onAbilityResult(requestCode,resultCode,resultData);
}
}

直接啟動(dòng)一個(gè) Ability 會(huì)發(fā)生頁(yè)面跳轉(zhuǎn),為了不讓頁(yè)面發(fā)生跳轉(zhuǎn),這里啟動(dòng)了一個(gè)透明的 Ability。

如何將 Ability 設(shè)置透明,如下代碼。在 abilities 節(jié)點(diǎn)添加 metaData,這里最關(guān)鍵的是 Translucent,也就是透明。

"abilities":[
{
"orientation":"unspecified",
"name":"com.poetry.taoyao.ability.PermissionAbility",
"icon":"$media:icon",
"description":"$string:permissionability_description",
"label":"$string:taoyao_PermissionAbility",
"type":"page",
"launchType":"standard",
"metaData":{
"customizeData":[
{
"name":"hwc-theme",
"value":"androidhwext:style/Theme.Emui.Translucent.NoTitleBar"
}
]
}
}

僅僅有上面的步驟好不夠,需要在 Ability 或者 AbilitySlice 里面將窗口設(shè)置成透明。

如下代碼:

getWindow().setTransparent(true);

經(jīng)過(guò)上面兩步,也就是將 Ability 的主題和窗口都設(shè)置成透明,這樣就能將 Ability 變成透明的了,同時(shí)也不會(huì)發(fā)生頁(yè)面跳轉(zhuǎn)。

⑥判斷用戶(hù)是否授予權(quán)限

判斷用戶(hù)是否授予權(quán)限,可以使用標(biāo)準(zhǔn)的方式來(lái)判斷。也就是通過(guò) grantResult 來(lái)判斷用戶(hù)是否授予權(quán)限。

@Override
publicbooleanhasPermission(int[]grantResults,String...permissions){
if(grantResults==null||grantResults.length<=?0){
returnfalse;
}
for(intgrantResult:grantResults){
if(grantResult==IBundleManager.PERMISSION_DENIED){
returnfalse;
}
}
returntrue;
}

其實(shí)還有另外的方式來(lái)判斷用戶(hù)是否授予權(quán)限。也就是不管用戶(hù)是否授權(quán),直接訪(fǎng)問(wèn)相關(guān)業(yè)務(wù)。

比如,申請(qǐng)錄音權(quán)限,當(dāng)系統(tǒng)回調(diào) onRequestPermissionsFromUserResult 方法時(shí),直接去錄音,如果發(fā)生異常,捕獲異常說(shuō)明沒(méi)有權(quán)限。

如下代碼:

/**
*通過(guò)直接錄音的方式來(lái)判斷是否有錄音權(quán)限
*
*@paramcontext
*@return
*@throwsThrowable
*/
@Override
publicbooleantest(Contextcontext)throwsThrowable{
AudioStreamInfoaudioStreamInfo=newAudioStreamInfo.Builder().encodingFormat(
AudioStreamInfo.EncodingFormat.ENCODING_PCM_16BIT)
.channelMask(AudioStreamInfo.ChannelMask.CHANNEL_IN_STEREO)
.sampleRate(AUDIO_SAMPLE_RATE)
.build();
AudioCapturerInfoaudioCapturerInfo=newAudioCapturerInfo.Builder().audioStreamInfo(audioStreamInfo).build();
try{
AudioCapturercapturer=newAudioCapturer(audioCapturerInfo);
//錄音
capturer.start();
newTimer().schedule(newTimerTask(){
@Override
publicvoidrun(){
capturer.stop();
}
},AUDIO_RECORDING_TIME);
//沒(méi)有發(fā)生異常,有權(quán)限
returntrue;
}catch(Exceptione){
//發(fā)生異常,無(wú)權(quán)限
returnfalse;
}
}

桃夭在判斷用戶(hù)是否授權(quán)時(shí),上面的兩種方式都使用了。至此,桃夭框架的原理基本上講完。有興趣的同學(xué)可以去看看源碼。

要看懂源碼,需要熟悉申請(qǐng)權(quán)限的一般步驟,桃夭其實(shí)就對(duì)這些步驟進(jìn)行封裝。另外還需熟悉面向接口編程、熟悉策略模式等常見(jiàn)設(shè)計(jì)模式。
編輯:jq
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4788

    瀏覽量

    68628
  • 權(quán)限
    +關(guān)注

    關(guān)注

    0

    文章

    13

    瀏覽量

    7271
  • 鴻蒙系統(tǒng)
    +關(guān)注

    關(guān)注

    183

    文章

    2634

    瀏覽量

    66355

原文標(biāo)題:一款好用的鴻蒙權(quán)限請(qǐng)求框架!

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    求推薦一款入門(mén)級(jí)risc-v開(kāi)發(fā)板

    求推薦一款入門(mén)級(jí)risc-v開(kāi)發(fā)板: 便宜好用,不超過(guò)100元。 支持wifi、藍(lán)牙。 功耗2.5W以?xún)?nèi)。 支持Linux系統(tǒng)。 謝謝哦。
    發(fā)表于 09-29 09:03

    瑞芯微RK3568鴻蒙開(kāi)發(fā)板OpenHarmony系統(tǒng)修改cfg文件權(quán)限方法

    本文適用于OpenHarmony開(kāi)源鴻蒙系統(tǒng)修改cfg文件權(quán)限方法,深圳觸覺(jué)智能研發(fā)的RK3566、RK3568、RK3588等開(kāi)發(fā)板、主板等產(chǎn)品均適用此教程
    的頭像 發(fā)表于 09-11 13:26 ?918次閱讀
    瑞芯微RK3568<b class='flag-5'>鴻蒙</b>開(kāi)發(fā)板OpenHarmony<b class='flag-5'>系統(tǒng)</b>修改cfg文件<b class='flag-5'>權(quán)限</b>方法

    鴻蒙開(kāi)發(fā)Ability Kit程序框架服務(wù):聲明權(quán)限

    應(yīng)用在申請(qǐng)權(quán)限時(shí),需要在項(xiàng)目的配置文件中,逐個(gè)聲明需要的權(quán)限,否則應(yīng)用將無(wú)法獲取授權(quán)。
    的頭像 發(fā)表于 07-01 09:22 ?344次閱讀
    <b class='flag-5'>鴻蒙</b>開(kāi)發(fā)Ability Kit程序<b class='flag-5'>框架</b>服務(wù):聲明<b class='flag-5'>權(quán)限</b>

    鴻蒙開(kāi)發(fā)Ability Kit程序框架服務(wù):向用戶(hù)申請(qǐng)授權(quán)

    當(dāng)應(yīng)用需要訪(fǎng)問(wèn)用戶(hù)的隱私信息或使用系統(tǒng)能力時(shí),例如獲取位置信息、訪(fǎng)問(wèn)日歷、使用相機(jī)拍攝照片或錄制視頻等,應(yīng)該向用戶(hù)請(qǐng)求授權(quán),這部分權(quán)限是user_grant權(quán)限。
    的頭像 發(fā)表于 07-01 09:18 ?597次閱讀
    <b class='flag-5'>鴻蒙</b>開(kāi)發(fā)Ability Kit程序<b class='flag-5'>框架</b>服務(wù):向用戶(hù)申請(qǐng)授權(quán)

    鴻蒙跨平臺(tái)框架:【ArkUi-X】創(chuàng)建工程

    鴻蒙推出了鴻ArkUi-X 框架所以就寫(xiě)個(gè)文章分享
    的頭像 發(fā)表于 05-13 17:48 ?952次閱讀
    <b class='flag-5'>鴻蒙</b>跨平臺(tái)<b class='flag-5'>框架</b>:【ArkUi-X】創(chuàng)建工程

    鴻蒙開(kāi)發(fā)接口Ability框架:【 (Context模塊)】

    Context模塊提供了ability或application的上下文的能力,包括允許訪(fǎng)問(wèn)特定于應(yīng)用程序的資源、請(qǐng)求和驗(yàn)證權(quán)限等。
    的頭像 發(fā)表于 05-13 16:04 ?721次閱讀
    <b class='flag-5'>鴻蒙</b>開(kāi)發(fā)接口Ability<b class='flag-5'>框架</b>:【 (Context模塊)】

    鴻蒙原生應(yīng)用元服務(wù)-訪(fǎng)問(wèn)控制(權(quán)限)開(kāi)發(fā)等級(jí)和類(lèi)型

    的接口,系統(tǒng)彈框由用戶(hù)授權(quán),用戶(hù)結(jié)合應(yīng)用運(yùn)行場(chǎng)景的上下文,識(shí)別出應(yīng)用申請(qǐng)相應(yīng)敏感權(quán)限的合理性,從而做出正確的選擇。 即使用戶(hù)向應(yīng)用授予過(guò)請(qǐng)求權(quán)限,應(yīng)用在調(diào)用受此
    發(fā)表于 04-17 15:29

    鴻蒙OS開(kāi)發(fā)實(shí)例:【HarmonyHttpClient】網(wǎng)絡(luò)框架

    鴻蒙上使用的Http網(wǎng)絡(luò)框架,里面包含純Java實(shí)現(xiàn)的HttpNet,類(lèi)似okhttp使用,支持同步和異步兩種請(qǐng)求方式;還有鴻蒙版retrofit,和Android版Retrofit相
    的頭像 發(fā)表于 04-12 16:58 ?836次閱讀
    <b class='flag-5'>鴻蒙</b>OS開(kāi)發(fā)實(shí)例:【HarmonyHttpClient】網(wǎng)絡(luò)<b class='flag-5'>框架</b>

    鴻蒙系統(tǒng)三防平板怎么樣

    鴻蒙系統(tǒng)三防平板是一款功能強(qiáng)大、性能卓越的平板電腦,其獨(dú)特的三防設(shè)計(jì)使其成為各種惡劣環(huán)境下的理想選擇。無(wú)論是戶(hù)外探險(xiǎn)、工地作業(yè)還是軍事應(yīng)用,鴻蒙系統(tǒng)
    發(fā)表于 04-12 14:26

    鴻蒙OS開(kāi)發(fā)實(shí)例:【窺探網(wǎng)絡(luò)請(qǐng)求

    HarmonyOS 平臺(tái)中使用網(wǎng)絡(luò)請(qǐng)求,需要引入 "@ohos.net.http", 并且需要在 module.json5 文件中申請(qǐng)網(wǎng)絡(luò)權(quán)限, 即 “ohos.permission.INTERNET” 本篇文章將嘗試使用 @ohos.net.http 來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)
    的頭像 發(fā)表于 04-01 16:11 ?792次閱讀
    <b class='flag-5'>鴻蒙</b>OS開(kāi)發(fā)實(shí)例:【窺探網(wǎng)絡(luò)<b class='flag-5'>請(qǐng)求</b>】

    學(xué)習(xí)鴻蒙背后的價(jià)值?星河版開(kāi)放如何學(xué)習(xí)?

    鴻蒙原生內(nèi)核。 實(shí)現(xiàn)了AI框架、大模型、設(shè)計(jì)系統(tǒng)、編程框架、編程語(yǔ)言、編譯器等全棧自研,有核心技術(shù)、全棧能力、底座和生態(tài),是真正的操作系統(tǒng),
    發(fā)表于 02-22 20:55

    如何在鴻蒙系統(tǒng)安裝Google Play

    隨著鴻蒙(HarmonyOS)系統(tǒng)的逐漸普及和用戶(hù)基數(shù)的增加,些用戶(hù)希望能在鴻蒙系統(tǒng)使用Go
    的頭像 發(fā)表于 01-31 17:13 ?1.6w次閱讀

    分鐘了解鴻蒙OS 應(yīng)用權(quán)限管理

    HarmonyOS 中所有的應(yīng)用均在應(yīng)用沙盒內(nèi)運(yùn)行。默認(rèn)情況下,應(yīng)用只能訪(fǎng)問(wèn)有限的系統(tǒng)資源,系統(tǒng)負(fù)責(zé)管理應(yīng)用對(duì)資源的訪(fǎng)問(wèn)權(quán)限。 應(yīng)用權(quán)限管理是由接口提供方(Ability)、接口使用方
    的頭像 發(fā)表于 01-26 15:23 ?820次閱讀

    鴻蒙系統(tǒng)和安卓的區(qū)別 鴻蒙系統(tǒng)有什么特別之處

    鴻蒙系統(tǒng)是華為公司自主研發(fā)的一款全新操作系統(tǒng),旨在替代安卓系統(tǒng)。鴻蒙
    的頭像 發(fā)表于 01-18 11:45 ?1.2w次閱讀

    鴻蒙系統(tǒng)和安卓的區(qū)別哪個(gè)好用

    些問(wèn)題,如性能、隱私安全等。而安卓系統(tǒng)是由谷歌開(kāi)發(fā)和推廣的移動(dòng)設(shè)備操作系統(tǒng),目前在全球范圍內(nèi)占據(jù)主導(dǎo)地位。 鴻蒙系統(tǒng)的架構(gòu)更為先進(jìn)和高效
    的頭像 發(fā)表于 01-11 11:15 ?1953次閱讀