色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

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

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

HarmonyOS開發(fā)案例:【應(yīng)用添加運(yùn)行時(shí)權(quán)限】

jf_46214456 ? 來源:jf_46214456 ? 作者:jf_46214456 ? 2024-04-22 15:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

介紹

通過AbilityAccessCtrl動(dòng)態(tài)向用戶申請(qǐng)“允許不同設(shè)備間的數(shù)據(jù)交換”的權(quán)限,使用設(shè)備管理實(shí)例獲取周邊不可信設(shè)備列表。

說明: 查詢周邊不可信設(shè)備之前,請(qǐng)確保本設(shè)備與周邊設(shè)備未進(jìn)行配對(duì)。如果已配對(duì),則恢復(fù)出廠設(shè)置之后重新查詢。

相關(guān)概念

  • [訪問控制權(quán)限申請(qǐng)]:應(yīng)用的APL(Ability Privilege Level)等級(jí)分為normal、system_basic和system_core三個(gè)等級(jí),默認(rèn)情況下,應(yīng)用的APL等級(jí)都為normal等級(jí)。權(quán)限類型分為system_grant和user_grant兩種類型。應(yīng)用可申請(qǐng)的權(quán)限項(xiàng)參見應(yīng)用權(quán)限列表。
  • [權(quán)限類型說明]:根據(jù)授權(quán)方式的不同,權(quán)限類型可分為system_grant(系統(tǒng)授權(quán))和user_grant(用戶授權(quán))。
  • [應(yīng)用ALP等級(jí)說明]:元能力權(quán)限等級(jí)APL(Ability Privilege Level)指的是應(yīng)用的權(quán)限申請(qǐng)優(yōu)先級(jí)的定義,不同APL等級(jí)的應(yīng)用能夠申請(qǐng)的權(quán)限等級(jí)不同。
  • [應(yīng)用權(quán)限列表]:在申請(qǐng)目標(biāo)權(quán)限前,建議開發(fā)者先閱讀訪問控制開發(fā)概述-權(quán)限的工作流程。對(duì)權(quán)限的工作流程有基本的了解后,再結(jié)合以下權(quán)限的具體說明,判斷應(yīng)用能否申請(qǐng)目標(biāo)權(quán)限,提高開發(fā)效率。
  • [設(shè)備管理實(shí)例]:用于獲取可信設(shè)備和本地設(shè)備的相關(guān)信息。在調(diào)用DeviceManager的方法前,需要先通過createDeviceManager構(gòu)建一個(gè)DeviceManager實(shí)例dmInstance。

約束與限制

通過DevEco Studio自動(dòng)下載的SDK均為public版本,public-SDK不支持開發(fā)者使用系統(tǒng)API。本篇Codelab使用的DeviceManager(設(shè)備管理實(shí)例)依賴于系統(tǒng)API,需下載full-SDK并替換工具自動(dòng)下載的public-SDK。

相關(guān)權(quán)限

本篇Codelab需要在配置文件module.json5里添加允許不同設(shè)備間的數(shù)據(jù)交換權(quán)限:ohos.permission.DISTRIBUTED_DATASYNC。

環(huán)境搭建

軟件要求

  • [DevEco Studio]版本:DevEco Studio 3.1 Release。
  • OpenHarmony SDK版本:API version 9。

硬件要求

  • 開發(fā)板類型:[潤(rùn)和RK3568開發(fā)板]。
  • OpenHarmony系統(tǒng):3.2 Release。

環(huán)境搭建

完成本篇Codelab我們首先要完成開發(fā)環(huán)境的搭建,本示例以RK3568開發(fā)板為例,參照以下步驟進(jìn)行:

  1. [獲取OpenHarmony系統(tǒng)版本]:標(biāo)準(zhǔn)系統(tǒng)解決方案(二進(jìn)制)。以3.2 Release版本為例:
  2. 搭建燒錄環(huán)境。
    1. [完成DevEco Device Tool的安裝]
    2. [完成RK3568開發(fā)板的燒錄]
  3. 搭建開發(fā)環(huán)境。
    1. 開始前請(qǐng)參考[工具準(zhǔn)備],完成DevEco Studio的安裝和開發(fā)環(huán)境配置。
    2. 開發(fā)環(huán)境配置完成后,請(qǐng)參考[使用工程向?qū)創(chuàng)建工程(模板選擇“Empty Ability”)。
    3. 工程創(chuàng)建完成后,選擇使用[真機(jī)進(jìn)行調(diào)測(cè)]。
    4. 鴻蒙開發(fā)指導(dǎo)文檔:[gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md]

代碼結(jié)構(gòu)解讀

本篇Codelab只對(duì)核心代碼進(jìn)行講解,對(duì)于完整代碼,我們會(huì)在gitee中提供。
搜狗高速瀏覽器截圖20240326151547.png

├──entry/src/main/ets                      // 代碼區(qū)
│  ├──common
│  │  ├──constants
│  │  │  └──CommonConstants.ets            // 公共常量類
│  │  └──util
│  │     ├──DeviceListUtil.ets             // 設(shè)備查詢工具類
│  │     ├──Logger.ets                     // 日志管理工具類
│  │     └──PermissionUtil.ets             // 權(quán)限申請(qǐng)工具類
│  ├──entryability
│  │  └──EntryAbility.ts                   // 程序入口類
│  ├──pages
│  │  └──HomePage.ets                      // 主頁面
│  └──view
│     ├──DeviceBean.ets                    // 設(shè)備信息類
│     ├──DeviceItem.ets                    // 設(shè)備信息對(duì)象
│     ├──DeviceListDialog.ets              // 設(shè)備列表展示彈框
│     └──NoPermissionDialog.ets            // 無權(quán)限彈框
└──entry/src/main/resource                 // 應(yīng)用靜態(tài)資源目錄

頁面設(shè)計(jì)

頁面分為授權(quán)圖片、授權(quán)說明、查詢內(nèi)網(wǎng)設(shè)備按鈕三部分,效果如圖所示:

// HomePage.ets
struct HomePage {
  @State authorizedImage: Resource = $r('app.media.ic_unauthorized');
  @State permissionDescribe: Resource = $r('app.string.no_permission');
  noPermissionDialog: CustomDialogController = new CustomDialogController({
    builder: NoPermissionDialog(),
    autoCancel: false,
    alignment: DialogAlignment.Bottom,
    offset: {
      dx: CommonConstants.DIALOG_OFFSET_X,
      dy: CommonConstants.DIALOG_OFFSET_Y
    }
  });
  deviceListDialog: CustomDialogController = new CustomDialogController({
    builder: DeviceListDialog(),
    autoCancel: false,
    alignment: DialogAlignment.Bottom,
    offset: {
      dx: CommonConstants.DIALOG_OFFSET_X,
      dy: CommonConstants.DIALOG_OFFSET_Y
    }
  })
  ...
  build() {
    Column() {
      Image(this.authorizedImage)
        ...
      Text(this.permissionDescribe)
        ...
      Column() {
        Button($r('app.string.button_text'), { type: ButtonType.Capsule, stateEffect: true })
          ...
      }
      ...
    }
    ...
  }
}

授權(quán)狀態(tài)為未授權(quán)時(shí),點(diǎn)擊查詢內(nèi)網(wǎng)設(shè)備按鈕打開未申請(qǐng)權(quán)限提示的彈框,效果如圖所示:

// NoPermissionDialog.ets
@CustomDialog
export struct NoPermissionDialog {
  controller: CustomDialogController;
 
  build() {
    Column() {
      Text($r('app.string.no_permission_title'))
        ...
      Text($r('app.string.clear_permission'))
        ...
      Text($r('app.string.dialog_confirm'))
        ...
        .onClick(() = > {
          this.controller.close();
        })
    }
    ...
  }
}

授權(quán)狀態(tài)為已授權(quán)時(shí),點(diǎn)擊查詢內(nèi)網(wǎng)設(shè)備按鈕打開設(shè)備查詢列表彈框,效果如圖所示:

// DeviceListDialog.ets
@CustomDialog
export struct DeviceListDialog {
  private deviceListUtil: DeviceListUtil = new DeviceListUtil();
  @State deviceList: Array< DeviceBean > = [];
  controller: CustomDialogController;
  ...
  build() {
    Column() {
      Text($r('app.string.device_list'))
        ...
      Column() {
        if (this.deviceList.length === 0) {
          Text($r('app.string.no_device'))
            ...
        } else {
          Column() {
            List() {
              ForEach(this.deviceList, (item: DeviceBean, index: number) = > {
                ListItem() {
                  DeviceItem({item: item, index: index});
                }
              }, (item: DeviceBean) = > JSON.stringify(item))
            }
          }
          ...
        }
      }
      ...
      Text($r('app.string.dialog_confirm'))
        ...
        .onClick(() = > {
          this.deviceListUtil.stopDeviceDiscovery();
          this.controller.close();
        })
    }
    ...
  }
}

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

首次進(jìn)入主頁面彈出授權(quán)彈框,點(diǎn)擊禁止按鈕不會(huì)授權(quán),點(diǎn)擊允許按鈕進(jìn)行授權(quán),再次進(jìn)入首頁不會(huì)出現(xiàn)授權(quán)彈框。

// HomePage.ets
struct HomePage {
  ...
  async aboutToAppear() {
    let result = await PermissionUtil.applyPermission();
    if (result === 0) {
      this.permissionDescribe = $r('app.string.has_permission');
      this.authorizedImage = $r('app.media.ic_authorized');
    } else {
      this.permissionDescribe = $r('app.string.no_permission');
    }
  }
  ...
}

// PermissionUtil.ets
async applyPermission() {
  let atManager = abilityAccessCtrl.createAtManager();
  let data = await atManager.requestPermissionsFromUser(getContext(this), [CommonConstants.PERMISSION]);
  let grantStatus: Array< number > = data.authResults;
  let length: number = grantStatus.length;
  if (length === 0) {
    return 1;
  }
  return grantStatus[0];
}

主頁面點(diǎn)擊查詢內(nèi)網(wǎng)設(shè)備按鈕時(shí),先查詢是否授權(quán),根據(jù)授權(quán)狀態(tài)打開對(duì)應(yīng)的彈框(未授權(quán):打開未授權(quán)彈框;已授權(quán):打開設(shè)備查詢列表彈框)。

// HomePage.ets
struct HomePage {
  ...
  build() {
    Column() {
      ...
      Column() {
        Button($r('app.string.button_text'), { type: ButtonType.Capsule, stateEffect: true })
          ...
          .onClick(async () = > {
            let result = await PermissionUtil.checkPermission();
            if(result === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
              this.deviceListDialog.open();
            } else {
              this.noPermissionDialog.open();
            }
          })
      }
      ...
    }
    ...
  }
}

// PermissionUtil.ets
async checkPermission() {
  let atManager = abilityAccessCtrl.createAtManager();
  let grantStatus: abilityAccessCtrl.GrantStatus =  abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;
  let tokenId: number = 0;
  try {
    let bundleInfo: bundleManager.BundleInfo =
      await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
    let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
    tokenId = appInfo.accessTokenId;
  } catch (err) {
    Logger.error(TAG, 'getBundleInfoForSelf failed, code is ${err.code}, message is ${err.message}');
  }
  try {
    grantStatus = await atManager.checkAccessToken(tokenId, CommonConstants.PERMISSION);
  } catch (err) {
    Logger.error(TAG, 'checkAccessToken failed, code is ${err.code}, message is ${err.message}');
  }
  return grantStatus;
}

設(shè)備查詢

先創(chuàng)建dmInstance實(shí)例,再注冊(cè)發(fā)現(xiàn)設(shè)備(deviceFoundOn)的回調(diào)方法,最后調(diào)用startDeviceDiscovery方法查詢周邊設(shè)備;當(dāng)查詢到設(shè)備之后調(diào)用deviceFoundOn方法處理設(shè)備信息。

//DeviceListDialog.ets
export struct DeviceListDialog {
  ...
  aboutToAppear() {
    this.deviceListUtil.initDmInstance((data: DeviceInfoInterface) = > {
      ...
    });
  }
  ...
}

// DeviceListUtil.ets
// 創(chuàng)建dmInstance實(shí)例
initDmInstance(dealDeviceInfo: Function) {
  this.dealDeviceInfo = dealDeviceInfo;
  try {
    deviceManager.createDeviceManager(getContext(this).applicationInfo.name, (err, data) = > {
      if (err) {
        Logger.error(TAG, 'createDeviceManager errCode:' + err.code + ',errMessage:' + err.message);
        return;
      }
      this.dmInstance = data;
      this.deviceFoundOn();
      this.startDeviceDiscovery();
    });
  } catch (err) {
    Logger.error(TAG, 'createDeviceManager err=' + JSON.stringify(err));
  }
}

// DeviceListUtil.ets
// 注冊(cè)發(fā)現(xiàn)設(shè)備回調(diào)方法
deviceFoundOn() {
  try {
    if (this.dmInstance !== undefined) {
      this.dmInstance.on('deviceFound', (data) = > {
        if (this.dealDeviceInfo !== undefined) {
          this.dealDeviceInfo(data);
        }
      });
    }
  } catch (err) {
    Logger.error(TAG, 'deviceFoundOn err:' + JSON.stringify(err));
  }
}

// DeviceListUtil.ets
// 發(fā)現(xiàn)周邊設(shè)備方法
startDeviceDiscovery() {
  this.subscribeId = Math.floor(Math.random() * CommonConstants.RANDOM_ONE + CommonConstants.RANDOM_TWO);
  let subscribeInfo: SubscribeInfoInterface = {
    subscribeId: this.subscribeId,
    mode: CommonConstants.MODE,
    medium: 0,
    freq: CommonConstants.FREQ,
    isSameAccount: false,
    isWakeRemote: true,
    capability: 1
  };
  try {
    if (this.dmInstance !== undefined) {
      this.dmInstance.startDeviceDiscovery(subscribeInfo);
    }
  } catch (err) {
    Logger.error(TAG, 'startDeviceDiscovery err:' + JSON.stringify(err));
  }
}

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 鴻蒙
    +關(guān)注

    關(guān)注

    60

    文章

    2631

    瀏覽量

    44106
  • HarmonyOS
    +關(guān)注

    關(guān)注

    80

    文章

    2127

    瀏覽量

    33258
  • OpenHarmony
    +關(guān)注

    關(guān)注

    30

    文章

    3856

    瀏覽量

    18689
收藏 0人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何縮短Vivado的運(yùn)行時(shí)

    在Vivado Implementation階段,有時(shí)是有必要分析一下什么原因?qū)е?b class='flag-5'>運(yùn)行時(shí)間(runtime)過長(zhǎng),從而找到一些方法來縮短運(yùn)行時(shí)間。
    的頭像 發(fā)表于 05-29 14:37 ?1.5w次閱讀
    如何縮短Vivado的<b class='flag-5'>運(yùn)行時(shí)</b>間

    運(yùn)行時(shí)添加100個(gè)項(xiàng)目

    列表小部件受到嚴(yán)重性能問題的影響。如果你試圖在運(yùn)行時(shí)添加100個(gè)項(xiàng)目,它將永遠(yuǎn)持續(xù)下去!?。。?duì)于你添加的每一項(xiàng),所需的時(shí)間加倍!我測(cè)量了這個(gè)時(shí)間,在一個(gè)200兆赫PIC32,需要超過5秒來
    發(fā)表于 04-06 16:06

    HarmonyOS應(yīng)用開發(fā)-應(yīng)用權(quán)限安全

    HarmonyOS應(yīng)用開發(fā)安全主要分為兩個(gè)方面:應(yīng)用權(quán)限和生物特征識(shí)別。應(yīng)用權(quán)限嚴(yán)格按照權(quán)限分類分級(jí)模型進(jìn)行定義,如圖1所示,具體過程可分為
    發(fā)表于 09-23 14:26

    如何TouchGFX運(yùn)行時(shí)添加小部件、行等?

    您好,是否可以在運(yùn)行時(shí)在畫布上添加一條線?我正在設(shè)法做一個(gè) log x 比例尺,為幾十年的分隔符提供一個(gè) Line 對(duì)象,但我的情節(jié)可能超過十年,所以我認(rèn)為根據(jù)需要添加許多行,然后讓每一行都可見是一
    發(fā)表于 12-02 07:36

    運(yùn)行時(shí)軟件故障注入器的設(shè)計(jì)與實(shí)現(xiàn)

    針對(duì)實(shí)際故障診斷中難以有效獲得故障現(xiàn)場(chǎng)信息的問題,提出通過在軟件運(yùn)行時(shí)注入故障的方式獲取故障現(xiàn)場(chǎng)信息,設(shè)計(jì)并實(shí)現(xiàn)一種運(yùn)行時(shí)軟件故障注入器,給出其中的故障腳本描
    發(fā)表于 04-06 08:40 ?19次下載

    FPGA運(yùn)行時(shí)重構(gòu)的延遲隱藏機(jī)制研究與實(shí)現(xiàn)

    FPGA運(yùn)行時(shí)重構(gòu)的延遲隱藏機(jī)制研究與實(shí)現(xiàn)_劉偉
    發(fā)表于 01-07 19:08 ?0次下載

    紫金橋組態(tài)軟件新的功能_運(yùn)行時(shí)組態(tài)

    運(yùn)行時(shí)組態(tài)是組態(tài)軟件新近提出的新的概念。運(yùn)行時(shí)組態(tài)是在運(yùn)行環(huán)境下對(duì)已有工程進(jìn)行修改,添加新的功能。它不同于在線組態(tài),在線組態(tài)是在工程運(yùn)行的同
    發(fā)表于 10-13 16:17 ?2次下載
    紫金橋組態(tài)軟件新的功能_<b class='flag-5'>運(yùn)行時(shí)</b>組態(tài)

    華為開發(fā)者分論壇HarmonyOS學(xué)生公開課-OpenHarmony Codelabs開發(fā)案

    2021華為開發(fā)者分論壇HarmonyOS學(xué)生公開課-OpenHarmony Codelabs開發(fā)案
    的頭像 發(fā)表于 10-24 11:25 ?2178次閱讀
    華為<b class='flag-5'>開發(fā)</b>者分論壇<b class='flag-5'>HarmonyOS</b>學(xué)生公開課-OpenHarmony Codelabs<b class='flag-5'>開發(fā)案</b>例

    如何高效測(cè)量ECU的運(yùn)行時(shí)

    ,最終可能會(huì)引起運(yùn)行時(shí)間方面的問題。這在項(xiàng)目后期需要大量的時(shí)間和金錢來解決。如果不能掌握系統(tǒng)的運(yùn)行狀態(tài),則很難發(fā)現(xiàn)系統(tǒng)內(nèi)缺陷的根源。 解決方案 將TA軟件工具套件與VX1000測(cè)量標(biāo)定硬件相結(jié)合,可同步分析 ECU內(nèi)部運(yùn)行時(shí)序和
    的頭像 發(fā)表于 10-28 11:05 ?2583次閱讀

    Go運(yùn)行時(shí):4年之后

    自 2018 年以來,Go GC,以及更廣泛的 Go 運(yùn)行時(shí),一直在穩(wěn)步改進(jìn)。近日,Go 社區(qū)總結(jié)了 4 年來 Go 運(yùn)行時(shí)的一些重要變化。
    的頭像 發(fā)表于 11-30 16:21 ?1080次閱讀

    什么是Kubernetes容器運(yùn)行時(shí)CRI

    起初,Docker是事實(shí)上的容器技術(shù)標(biāo)準(zhǔn),Kubernetes v1.5之前的代碼中直接調(diào)用Docker API,實(shí)現(xiàn)容器運(yùn)行時(shí)的相關(guān)操作。
    的頭像 發(fā)表于 02-20 16:22 ?2049次閱讀
    什么是Kubernetes容器<b class='flag-5'>運(yùn)行時(shí)</b>CRI

    ch32v307記錄程序運(yùn)行時(shí)

    ch32v307記錄程序運(yùn)行時(shí)間 在程序開發(fā)中,很重要的一項(xiàng)任務(wù)就是對(duì)程序的運(yùn)行時(shí)間進(jìn)行評(píng)估。對(duì)于大型的程序系統(tǒng)來說,它們通常需要處理大量的數(shù)據(jù)或進(jìn)行復(fù)雜的計(jì)算操作。因此,如果程序的運(yùn)行時(shí)
    的頭像 發(fā)表于 08-22 15:53 ?1300次閱讀

    Xilinx運(yùn)行時(shí)(XRT)發(fā)行說明

    電子發(fā)燒友網(wǎng)站提供《Xilinx運(yùn)行時(shí)(XRT)發(fā)行說明.pdf》資料免費(fèi)下載
    發(fā)表于 09-14 10:01 ?0次下載
    Xilinx<b class='flag-5'>運(yùn)行時(shí)</b>(XRT)發(fā)行說明

    如何保證它們?nèi)萜?b class='flag-5'>運(yùn)行時(shí)的安全?

    緊密耦合的容器運(yùn)行時(shí)繼承了主機(jī)操作系統(tǒng)的安全態(tài)勢(shì)和攻擊面。運(yùn)行時(shí)或主機(jī)內(nèi)核中的任何漏洞及其利用都會(huì)成為攻擊者的潛在切入點(diǎn)。
    的頭像 發(fā)表于 11-03 15:24 ?1013次閱讀

    jvm運(yùn)行時(shí)內(nèi)存區(qū)域劃分

    JVM是Java Virtual Machine(Java虛擬機(jī))的縮寫,它是Java編程語言的運(yùn)行環(huán)境。JVM的主要功能是將Java源代碼轉(zhuǎn)換為機(jī)器代碼,并且在運(yùn)行時(shí)管理Java程序的內(nèi)存。JVM
    的頭像 發(fā)表于 12-05 14:08 ?760次閱讀
    主站蜘蛛池模板: 男女生爽爽爽视频免费观看 | 午夜福到在线2019 | 久久久久久人精品免费费看 | 成 人 网 站毛片 | 野花韩国视频中文播放 | 在线观看成年人免费视频 | 久久怡红院国产精品 | 中文字幕在线观看网站 | 蜜桃最新网址 | 亚洲视频中文字幕在线观看 | 免费毛片a在线观看67194 | 草草久久久亚洲AV成人片 | 亚洲国产中文字幕在线视频综合 | 91进入蜜桃臀在线播放 | 久久免费特黄毛片 | 医生含着我的奶边摸边做 | 亚洲精品视频免费在线观看 | 久久高清内射无套 | 精品成人在线视频 | 日本午夜视频在线 | 国产精品日本欧美一区二区 | 成人影院久久久久久影院 | 国内精品久久久久影院网站 | 国产精品一区二区四区 | 久久久精品国产免费A片胖妇女 | 女人把腿张开叫男人桶免费视频 | 亚洲国产区中文在线观看 | 免费在线观看的毛片 | 亚洲午夜精品A片久久软件 亚洲午夜精品A片久久不卡蜜桃 | 97无码人妻精品1国产精东影业 | 0855福利 | 99视频福利| 少爷被多个暗卫肉高h | 3D内射动漫同人资源在线观看 | 国产成人拍精品免费视频爱情岛 | 亚洲野狼综合网站 | 国产精品18久久久久久欧美 | 私人玩物在线观看 | 精品国产乱码久久久久久口爆 | 美女拉开腿让男生桶到爽 | 国产麻豆91网在线看 |

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品