精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HarmonyOS 項目實戰(zhàn)之通訊錄(Java)

開發(fā) 后端 OpenHarmony
通訊錄demo主要分為聯(lián)系人界面、設置緊急聯(lián)系人、服務卡片3個模塊,分為Java和JS兩個版本,本篇主要講解用盡可能的用Java去實現(xiàn)。

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

1 簡介

通訊錄demo主要分為聯(lián)系人界面、設置緊急聯(lián)系人、服務卡片3個模塊,分為Java和JS兩個版本,本篇主要講解用盡可能的用Java去實現(xiàn)。

1.1 原型

感興趣的小伙伴,可以自己根據(jù)原型效果自己嘗試著去實現(xiàn)【通訊錄demo簡易原型】。

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄(Java)-鴻蒙HarmonyOS技術社區(qū)#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄(Java)-鴻蒙HarmonyOS技術社區(qū)#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄(Java)-鴻蒙HarmonyOS技術社區(qū)

1.2 場景示例

通過學習與練習本demo,可以延伸至以下場景。

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄(Java)-鴻蒙HarmonyOS技術社區(qū)#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄(Java)-鴻蒙HarmonyOS技術社區(qū)#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄(Java)-鴻蒙HarmonyOS技術社區(qū)

1.3 項目實戰(zhàn)

《HarmonyOS 項目實戰(zhàn)之通訊錄Demo(JS)》

《HarmonyOS 項目實戰(zhàn)之通訊錄(Java)》

《HarmonyOS 項目實戰(zhàn)之新聞頭條(ArkUI-TS》

2 功能開發(fā)

2.1 聯(lián)系人列表

2.1.1 實現(xiàn)效果

2.1.2 核心代碼

參考:ListContainer-常用組件開發(fā)指導-Java UI框架-UI-開發(fā)-HarmonyOS應用開發(fā)

  • ListContainer設置StickyContactProvider適配器
  • HeaderDecor頭部聯(lián)動效果設置
  • ContactData數(shù)據(jù)處理相關類,sortContactData方法用于排序等數(shù)據(jù)處理
  1. ContactData categoryData = ContactData.get(); 
  2.     categoryData.sortContactData(); 
  3.  
  4.     contactList = (ListContainer) findComponentById(ResourceTable.Id_contactList); 
  5.     Text headerText = (Text) findComponentById(ResourceTable.Id_sticky_text); 
  6.     List<ContactBean> dataList = categoryData.getResultList(); 
  7.  
  8.     mStickyContactProvider = new StickyContactProvider(this, dataList); 
  9.     contactList.setItemProvider(mStickyContactProvider); 
  10.     HeaderDecor headerDecor = new HeaderDecor(contactList, headerText); 

 sortContactData方法數(shù)據(jù)處理,排序,字母索引:

  1. public void sortContactData() { 
  2.     List<ContactBean> mContactList = new ArrayList<>(); 
  3.     Map<String, String> map = new HashMap<>(); 
  4.  
  5.     for (ContactBean contactBean : mContactBeans) { 
  6.         String pinyin = Utils.getPingYin(contactBean.getName()); 
  7.         map.put(pinyin, contactBean.getName()); 
  8.         contactBean.setNamepy(pinyin); 
  9.         mContactList.add(contactBean); 
  10.     } 
  11.     mContactList.sort(new ContactComparator()); 
  12.     characterList = new ArrayList<>(); 
  13.     resultList = new ArrayList<>(); 
  14.     for (ContactBean contactBean : mContactList) { 
  15.         String namepy = contactBean.getNamepy(); 
  16.         String character = (namepy.charAt(0) + "").toUpperCase(Locale.ENGLISH); 
  17.         if (!characterList.contains(character)) { 
  18.             if (character.hashCode() >= "A".hashCode() && character.hashCode() <= "Z".hashCode()) { // 是字母 
  19.                 characterList.add(character); 
  20.                 resultList.add(new ContactBean(character, ContactBean.ITEM_TYPE.ITEM_TYPE_CHARACTER.ordinal())); 
  21.             } else { 
  22.                 if (!characterList.contains("#")) { 
  23.                     characterList.add("#"); 
  24.                     resultList.add(new ContactBean("#", ContactBean.ITEM_TYPE.ITEM_TYPE_CHARACTER.ordinal())); 
  25.                 } 
  26.             } 
  27.         } 
  28.  
  29.         resultList.add(new ContactBean(contactBean.getName(), contactBean.getTelephone(), map.get(namepy), ContactBean.ITEM_TYPE.ITEM_TYPE_CONTACT.ordinal())); 
  30.     } 

2.2 數(shù)據(jù)的增刪改查

2.2.1 實現(xiàn)效果

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄(Java)-鴻蒙HarmonyOS技術社區(qū)

2.2.2 增刪改查實現(xiàn)

ListContainer刪除實現(xiàn)

  1. categoryData.deleteContactBeans(item); 
  2. categoryData.sortContactData(); 
  3. mStickyContactProvider.setDataListChanged(categoryData.getResultList()); 

 隨機添加一個聯(lián)系人

  1. categoryData.addContactBean("胡六一""15269856587"); 
  2. categoryData.sortContactData(); 
  3. mStickyContactProvider.setDataListChanged(categoryData.getResultList()); 

 ContactData數(shù)據(jù)處理效果類,實現(xiàn)數(shù)據(jù)增刪改查

  1. // Generate the javaBean of ContactData 
  2. public static ContactData get() { 
  3.     return new ContactData(); 
  4.  
  5. public List<ContactBean> getDefaultContactBeans() { 
  6.     return mDefaultContactBeans; 
  7.  
  8. public List<ContactBean> getContactBeans() { 
  9.     return mContactBeans; 
  10.  
  11. public void addContactBean(String name, String phone) { 
  12.     mContactBeans.add(new ContactBean(name, phone)); 
  13.  
  14. public List<ContactBean> deleteContactBeans(ContactBean item) { 
  15.     mContactBeans.removeIf(contactBean -> contactBean.getName().equals(item.getName())); 
  16.  
  17.     return mContactBeans; 
  18.  
  19. public List<ContactBean> getResultList() { 
  20.     return resultList; 
  21.  
  22. public List<String> getCharacterList() { 
  23.     return characterList; 
  24.  
  25. public int getScrollPosition(String character) { 
  26.     if (characterList.contains(character)) { 
  27.         for (int i = 0; i < resultList.size(); i++) { 
  28.             if (resultList.get(i).getCharacter().equals(character)) { 
  29.                 return i; 
  30.             } 
  31.         } 
  32.     } 
  33.  
  34.     return -1; // -1不會滑動 

2.2.3 緊急聯(lián)系人數(shù)據(jù)存儲

輕量級數(shù)據(jù)存儲:輕量級數(shù)據(jù)存儲概述-輕量級數(shù)據(jù)存儲-數(shù)據(jù)管理-開發(fā)-HarmonyOS應用開發(fā)

Key-Value數(shù)據(jù)結構

一種鍵值結構數(shù)據(jù)類型。Key是不重復的關鍵字,Value是數(shù)據(jù)值。

運作機制

  • 本模塊提供輕量級數(shù)據(jù)存儲的操作類,應用通過這些操作類完成數(shù)據(jù)庫操作。
  • 借助DatabaseHelper API,應用可以將指定文件的內(nèi)容加載到Preferences實例,每個文件最多有一個Preferences實例,系統(tǒng)會通過靜態(tài)容器將該實例存儲在內(nèi)存中,直到應用主動從內(nèi)存中移除該實例或者刪除該文件。
  • 獲取到文件對應的Preferences實例后,應用可以借助Preferences API,從Preferences實例中讀取數(shù)據(jù)或者將數(shù)據(jù)寫入Preferences實例,通過flush或者flushSync將Preferences實例持久化。

核心代碼實現(xiàn)

添加緊急聯(lián)系人,并通知java卡片更新。

  1. ZSONObject zsonObject = new ZSONObject(); 
  2. zsonObject.put("urgent1", nameTf1.getText()); 
  3. zsonObject.put("urgentPhone1", phoneTf1.getText()); 
  4. zsonObject.put("urgent2", nameTf2.getText()); 
  5. zsonObject.put("urgentPhone2", phoneTf2.getText()); 
  6. PreferenceUtils.putString(getContext(),"urgentPerson", ZSONObject.toZSONString(zsonObject)); 
  7. FormBindingData formBindingData = new FormBindingData(zsonObject); 
  8. ((ContactPersonAbility) getAbility()).confirmUpdateForm(formBindingData); 

 PreferenceUtils封裝工具類,實現(xiàn)數(shù)據(jù)存儲。

  1. public class PreferenceUtils { 
  2.     private static String PREFERENCE_FILE_NAME = "prefrence_file"
  3.     private static Preferences preferences; 
  4.     private static DatabaseHelper databaseHelper; 
  5.     private static Preferences.PreferencesObserver mPreferencesObserver; 
  6.  
  7.     private static void initPreference(Context context) { 
  8.         if (databaseHelper == null) { 
  9.             databaseHelper = new DatabaseHelper(context); 
  10.         } 
  11.         if (preferences == null) { 
  12.             preferences = databaseHelper.getPreferences(PREFERENCE_FILE_NAME); 
  13.         } 
  14.     } 
  15.  
  16.     //存放、獲取時傳入的context必須是同一個context,否則存入的數(shù)據(jù)無法獲取 
  17.     public static void putString(Context context, String key, String value) { 
  18.         initPreference(context); 
  19.         preferences.putString(key, value); 
  20.         preferences.flush(); 
  21.     } 
  22.  
  23.     /** 
  24.      * @param context 上下文 
  25.      * @param key     鍵 
  26.      * @return 獲取的String 默認值為:null 
  27.      */ 
  28.     public static String getString(Context context, String key) { 
  29.         initPreference(context); 
  30.         return preferences.getString(keynull); 
  31.     } 
  32.  
  33.     public static String getString(Context context, String key, String d) { 
  34.         initPreference(context); 
  35.         return preferences.getString(key, d); 
  36.     } 
  37.  
  38.     public static void putInt(Context context, String keyint value) { 
  39.         initPreference(context); 
  40.         preferences.putInt(key, value); 
  41.         preferences.flush(); 
  42.     } 
  43.  
  44.     /** 
  45.      * @param context 上下文 
  46.      * @param key     鍵 
  47.      * @return 獲取int的默認值為:-1 
  48.      */ 
  49.     public static int getInt(Context context, String key) { 
  50.         initPreference(context); 
  51.         return preferences.getInt(key, -1); 
  52.     } 
  53.     public static void putLong(Context context, String key, long value) { 
  54.         initPreference(context); 
  55.         preferences.putLong(key, value); 
  56.         preferences.flush(); 
  57.     } 
  58.  
  59.     /** 
  60.      * @param context 上下文 
  61.      * @param key     鍵 
  62.      * @return 獲取long的默認值為:-1 
  63.      */ 
  64.     public static long getLong(Context context, String key) { 
  65.         initPreference(context); 
  66.         return preferences.getLong(key, -1L); 
  67.     } 
  68.  
  69.     public static void putBoolean(Context context, String key, boolean value) { 
  70.         initPreference(context); 
  71.         preferences.putBoolean(key, value); 
  72.         preferences.flush(); 
  73.     } 
  74.  
  75.     /** 
  76.      * @param context 上下文 
  77.      * @param key     鍵 
  78.      * @return 獲取boolean的默認值為:false 
  79.      */ 
  80.     public static boolean getBoolean(Context context, String key) { 
  81.         initPreference(context); 
  82.         return preferences.getBoolean(keyfalse); 
  83.     } 
  84.  
  85.     public static void putFloat(Context context, String keyfloat value) { 
  86.         initPreference(context); 
  87.         preferences.putFloat(key, value); 
  88.         preferences.flush(); 
  89.     } 
  90.  
  91.     /** 
  92.      * @param context 上下文 
  93.      * @param key     鍵 
  94.      * @return 獲取float的默認值為:0.0 
  95.      */ 
  96.     public static float getFloat(Context context, String key) { 
  97.         initPreference(context); 
  98.         return preferences.getFloat(key, 0.0F); 
  99.     } 
  100.  
  101.     public static void putStringSet(Context context, String keySet<String> set) { 
  102.         initPreference(context); 
  103.         preferences.putStringSet(keyset); 
  104.         preferences.flush(); 
  105.     } 
  106.  
  107.     /** 
  108.      * @param context 上下文 
  109.      * @param key     鍵 
  110.      * @return 獲取set集合的默認值為:null 
  111.      */ 
  112.     public static Set<String> getStringSet(Context context, String key) { 
  113.         initPreference(context); 
  114.         return preferences.getStringSet(keynull); 
  115.     } 
  116.  
  117.     public static boolean deletePreferences(Context context) { 
  118.         initPreference(context); 
  119.         boolean isDelete = databaseHelper.deletePreferences(PREFERENCE_FILE_NAME); 
  120.         return isDelete; 
  121.     } 
  122.  
  123.     public static void registerObserver(Context context, Preferences.PreferencesObserver preferencesObserver) { 
  124.         initPreference(context); 
  125.         mPreferencesObserver = preferencesObserver; 
  126.         preferences.registerObserver(mPreferencesObserver); 
  127.     } 
  128.  
  129.     public static void unregisterObserver() { 
  130.         if (mPreferencesObserver != null) { 
  131.             // 向preferences實例注銷觀察者 
  132.             preferences.unregisterObserver(mPreferencesObserver); 
  133.         } 
  134.     } 

2.3 第三方跳轉

2.3.1 實現(xiàn)效果

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄(Java)-鴻蒙HarmonyOS技術社區(qū)

2.3.2 撥打電話與發(fā)送短信

  1. /** 
  2.      * 跳轉系統(tǒng)短信 
  3.      */ 
  4.     private void doMessage(String telephone) { 
  5.         Intent intent = new Intent(); 
  6.         Operation operation = new Intent.OperationBuilder() 
  7. //                .withAction("android.intent.action.SENDTO") // Android寫法 android.intent.action.SENDTO 
  8.                 .withAction(IntentConstants.ACTION_SEND_SMS) 
  9.                 .withUri(Uri.parse("smsto:" + telephone)) // 設置號碼 
  10.                 .withFlags(Intent.FLAG_NOT_OHOS_COMPONENT) 
  11.                 .build(); 
  12.         intent.setOperation(operation); 
  13.         context.startAbility(intent, 11); 
  14.     } 
  15.  
  16.     /** 
  17.      * 申請撥打電話權限 
  18.      */ 
  19.     private boolean requestPermissions() { 
  20.         if (context.verifySelfPermission("android.permission.CALL_PHONE") != IBundleManager.PERMISSION_GRANTED) { 
  21.             // 應用未被授予權限 
  22.             if (context.canRequestPermission("android.permission.CALL_PHONE")) { 
  23.                 // 是否可以申請彈框授權(首次申請或者用戶未選擇禁止且不再提示) 
  24.                 context.requestPermissionsFromUser(new String[]{"android.permission.CALL_PHONE"}, 100); 
  25.             } 
  26.             return false
  27.         } else { 
  28.             // 權限已被授予 
  29.             return true
  30.         } 
  31.     } 
  32.  
  33.     /** 
  34.      * 直接撥打電話 
  35.      * 需要申請權限 
  36.      */ 
  37.     private void doCall(String destinationNum) { 
  38.         if (!requestPermissions()) { 
  39.             return
  40.         } 
  41.         Intent intent = new Intent(); 
  42.         Operation operation = new Intent.OperationBuilder() 
  43.                 .withAction("android.intent.action.CALL") // 系統(tǒng)應用撥號盤 
  44.                 .withUri(Uri.parse("tel:" + destinationNum)) // 設置號碼 
  45.                 .withFlags(2) 
  46.                 .build(); 
  47.         intent.setOperation(operation); 
  48.         // 啟動Ability 
  49.         context.startAbility(intent, 10); 
  50.  
  51.     } 
  52.  
  53.     /** 
  54.      * 跳轉系統(tǒng)撥打電話界面 
  55.      */ 
  56.     private void doDial(String destinationNum) { 
  57.         Intent intent = new Intent(); 
  58.         Operation operation = new Intent.OperationBuilder() 
  59.                 .withAction(IntentConstants.ACTION_DIAL) // 系統(tǒng)應用撥號盤 
  60. //                .withBundleName(context.getCallingBundle()) // 應用撥號選擇器 
  61.                 .withUri(Uri.parse("tel:" + destinationNum)) // 設置號碼 
  62.                 .withFlags(2) 
  63.                 .build(); 
  64.         intent.setOperation(operation); 
  65.         // 啟動Ability 
  66.         context.startAbility(intent, 10); 
  67.  
  68.     } 

2.4 JS服務卡片

2.4.1 實現(xiàn)效果

#星光計劃2.0# HarmonyOS 項目實戰(zhàn)之通訊錄(Java)-鴻蒙HarmonyOS技術社區(qū)

2.4.2 創(chuàng)建卡片模板

使用DevEco Studio創(chuàng)建卡片工程

創(chuàng)建成功后,在config.json的module中會生成js模塊,用于對應卡片的js相關資源,配置示例如下:

  1. "js": [ 
  2.   { 
  3.     "pages": [ 
  4.       "pages/index/index" 
  5.     ], 
  6.     "name""widget"
  7.     "window": { 
  8.       "designWidth": 720, 
  9.       "autoDesignWidth"true 
  10.     }, 
  11.     "type""form" 
  12.   } 

 config.json文件“abilities”配置forms模塊細節(jié)如下:

  1. "name""com.huhu.contact.ContactPersonAbility"
  2. "icon""$media:icon"
  3. "description""$string:contactpersonability_description"
  4. "formsEnabled"true
  5. "label""$string:contact_ContactPersonAbility"
  6. "type""page"
  7. "forms": [ 
  8.   { 
  9.     "jsComponentName""widget"
  10.     "isDefault"true
  11.     "scheduledUpdateTime""10:30"
  12.     "defaultDimension""2*2"
  13.     "name""widget"
  14.     "description""This is a service widget"
  15.     "colorMode""auto"
  16.     "type""JS"
  17.     "supportDimensions": [ 
  18.       "2*2" 
  19.     ], 
  20.     "updateEnabled"true
  21.     "updateDuration": 1 
  22.   } 

 創(chuàng)建一個ContactPersonAbility,覆寫卡片相關回調函數(shù)。

  • onCreateForm(Intent intent)
  • onUpdateForm(long formId)
  • onDeleteForm(long formId)
  • onCastTempForm(long formId)
  • onEventNotify(Map
  • onTriggerFormEvent(long formId, String message)
  • onAcquireFormState(Intent intent)

當卡片使用方請求獲取卡片時,卡片提供方會被拉起并調用onCreateForm(Intent intent)回調,intent中會帶有卡片ID、卡片名稱和卡片外觀規(guī)格信息,可按需獲取使用。

開發(fā)JS卡片時,F(xiàn)ormAbility可以繼承AceAbility或Ability,繼承Ability時,需在onStart()方法中額外設置路由信息。

2.4.3 卡片數(shù)據(jù)綁定

  1. @Override 
  2.  public ProviderFormInfo bindFormData() { 
  3.      HiLog.info(TAG, "bind form data"); 
  4.      ProviderFormInfo providerFormInfo = new ProviderFormInfo(); 
  5.      String urgentPersonStr = PreferenceUtils.getString(context, "urgentPerson"""); 
  6.      ZSONObject zsonObject = ZSONObject.stringToZSON(urgentPersonStr); 
  7.      if (dimension == DEFAULT_DIMENSION_2X2) { 
  8.          if (zsonObject != null) { 
  9.              providerFormInfo.setJsBindingData(new FormBindingData(zsonObject)); 
  10.          } 
  11.      } 
  12.      return providerFormInfo; 
  13.  } 

 2.4.4 卡片數(shù)據(jù)更新

  1. public void confirmUpdateForm(FormBindingData formBindingData) { 
  2.     FormControllerManager formControllerManager = FormControllerManager.getInstance(this); 
  3.     List<Long> allFormIdFromSharePreference = formControllerManager.getAllFormIdFromSharePreference(); 
  4.     if (allFormIdFromSharePreference == null || allFormIdFromSharePreference.isEmpty()) return
  5.     Long formId = allFormIdFromSharePreference.get(0); 
  6.     try { 
  7.         updateForm(formId,formBindingData); 
  8.     } catch (FormException e) { 
  9.         e.printStackTrace(); 
  10.     } 

 2.4.5 卡片事件處理

  1.   "data": { 
  2.     "text_content""Name"
  3.     "cardPrimaryText""Contacts"
  4.     "cardSecondaryText""+8612345678912"
  5.     "urgent1""無"
  6.     "urgent2""無"
  7.     "urgentPhone1""+8612345678912"
  8.     "urgentPhone2""+8612345678915" 
  9.   }, 
  10.   "actions": { 
  11.     "urgentCall1": { 
  12.       "action""message"
  13.       "params": { 
  14.         "action""urgentCall1"
  15.         "phoneNumber""10086" 
  16.       } 
  17.     }, 
  18.     "urgentCall2": { 
  19.       "action""message"
  20.       "params": { 
  21.         "action""urgentCall2"
  22.         "phoneNumber""15565339857" 
  23.       } 
  24.     }, 
  25.     "startMainRouter": { 
  26.       "action""router"
  27.       "abilityName""com.huhu.contact.ContactPersonAbility" 
  28.     } 
  29.   } 

卡片支持觸發(fā)事件,覆寫onTriggerFormEvent方法實現(xiàn)對事件的觸發(fā),doCall就是前面的播打電話的方法

  1. @Override 
  2. protected void onTriggerFormEvent(long formId, String message) { 
  3.     super.onTriggerFormEvent(formId, message); 
  4.     HiLog.info(loglabel, "onTriggerFormEvent: " + message); 
  5.     FormControllerManager formControllerManager = FormControllerManager.getInstance(this); 
  6.     FormController formController = formControllerManager.getController(formId); 
  7.     formController.onTriggerFormEvent(formId, message); 
  8.     ZSONObject params = ZSONObject.stringToZSON(message); 
  9.     String action = params.getString("action"); 
  10.     String phoneNumber = params.getString("phoneNumber"); 
  11.     HiLog.info(loglabel, "onTriggerFormEvent: action:" + action); 
  12.  
  13.     String urgentPersonStr = PreferenceUtils.getString(this, "urgentPerson"""); 
  14.     ZSONObject zsonObject = ZSONObject.stringToZSON(urgentPersonStr); 
  15.     switch (action) { 
  16.         case "urgentCall1"
  17.             String urgentPhone1 = zsonObject.getString("urgentPhone1"); 
  18.             doCall(urgentPhone1); 
  19.             break; 
  20.         case "urgentCall2"
  21.             String urgentPhone2 = zsonObject.getString("urgentPhone2"); 
  22.             doCall(urgentPhone2); 
  23.             break; 
  24.         default
  25.             break; 
  26.     } 

3 注意事項

Demo還有很多需要完善的地方

  • 滑動時,上滑頭部聯(lián)動效果,索引有時會錯亂;
  • 搜索功能未實現(xiàn);
  • 緊急聯(lián)系人沒有和列表數(shù)據(jù)聯(lián)動。

4 總結

代碼地址: https://gitee.com/hu-lingqing/contact-person.git

想了解更多內(nèi)容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區(qū)

https://harmonyos.51cto.com

責任編輯:jianghua 來源: 鴻蒙社區(qū)
相關推薦

2021-12-10 10:12:44

鴻蒙HarmonyOS應用

2011-09-05 14:08:21

微信Andriod安卓

2014-09-24 10:29:14

微信企業(yè)號開發(fā)

2011-09-16 14:05:42

Andrioid應用iPhone應用Symbian應用

2014-09-28 22:30:13

微信企業(yè)號

2012-02-09 09:10:44

Path通訊錄隱私

2014-09-28 22:26:11

微信企業(yè)號

2010-06-18 22:42:42

智能手機平臺Android網(wǎng)秦

2012-06-05 13:53:03

天天聯(lián)系華為

2013-03-18 10:19:27

安卓軟件手機通訊錄隱私信息

2012-12-21 14:51:52

手機中國

2010-09-26 08:35:01

火種通訊錄

2011-07-20 08:49:24

jQuery MobiAndroid

2010-09-08 23:11:01

2010-05-12 14:42:20

2015-07-30 15:58:15

EC企信企業(yè)即時通訊

2011-07-19 17:25:14

jQuery MobiAndroid

2017-09-06 14:51:21

Swift

2011-11-28 14:37:32

點心通訊錄

2012-01-09 16:43:13

點心通訊錄
點贊
收藏

51CTO技術棧公眾號

福利视频在线导航| 韩国一级黄色录像| 日本另类视频| 亚洲免费观看高清完整版在线观看熊| 国产美女精品在线观看| 国产日产精品一区二区三区| 日韩大片在线观看| 日韩一区二区免费电影| 92看片淫黄大片一级| 秋霞午夜在线观看| 91色九色蝌蚪| 97超级碰碰| 中文字幕在线观看1| 欧美午夜一区| 亚洲人成在线一二| 男男受被啪到高潮自述| 三级成人黄色影院| 亚洲狠狠爱一区二区三区| 亚洲精品乱码久久久久久蜜桃91| 刘玥91精选国产在线观看| 日韩成人午夜精品| 97碰在线观看| 深夜福利影院在线观看| 日韩欧美午夜| 亚洲色在线视频| 88av在线播放| 日韩精品一级| 91 com成人网| 中日韩av在线播放| 外国电影一区二区| 色94色欧美sute亚洲线路一久| 韩日视频在线观看| 最新黄网在线观看| 国产精品国产三级国产普通话三级 | 午夜黄色福利视频| 久久最新网址| 日韩av一区二区在线| 日韩高清一二三区| 成人免费91| 欧美丰满嫩嫩电影| 自拍偷拍 国产| 久久爱91午夜羞羞| 福利视频导航一区| 欧美日本视频在线观看| 91资源在线观看| 亚洲一区二区三区影院| 麻豆一区二区三区在线观看| 免费黄色在线| 亚洲激情一二三区| 加勒比海盗1在线观看免费国语版| 欧美96在线| 综合久久一区二区三区| 亚洲国产精品综合| 国产美女性感在线观看懂色av| 91丨porny丨蝌蚪视频| 久久福利电影| 精品视频一二三| 久久久蜜桃精品| 欧洲精品久久| 北条麻妃在线| 亚洲丝袜制服诱惑| 男人的天堂视频在线| 青青草原国产在线| 精品久久久精品| 黄色a级片免费| 日本肉肉一区 | 日韩男女性生活视频| 亚洲欧美一区二区三区在线观看| 久久亚洲不卡| 国产一区二区色| www.国产麻豆| 成+人+亚洲+综合天堂| 久久婷婷开心| 超碰国产在线| 亚洲在线视频一区| 情侣黄网站免费看| 99tv成人影院| 亚洲成人中文字幕| 亚洲做受高潮无遮挡| 欧美xxxx中国| 国内精品久久久久伊人av| 中文字幕在线观看视频网站| 日本中文字幕不卡| 亚洲一区二区三区久久| 天天色综合久久| 欧美高清一级片在线观看| 黄色一级片网址| 超级碰碰不卡在线视频| 欧美性videosxxxxx| 青娱乐国产精品视频| 欧美精品中文字幕亚洲专区| 国产亚洲精品91在线| 看免费黄色录像| 一本一本久久| 成人综合网网址| 天堂网在线播放| 国产精品久久久久久妇女6080| 日本香蕉视频在线观看| 国精产品一区一区三区四川| 欧美一区二区三区在线观看 | 中文字幕亚洲一区二区va在线| 精品免费久久久久久久| 网友自拍亚洲| 精品裸体舞一区二区三区| 欧美黄色激情视频| 黄色精品网站| 91精品美女在线| 欧美另类自拍| 亚洲一区二区三区在线播放| 中文字幕永久有效| 国产成人三级| 国内精品久久久久久久| 国产老女人乱淫免费| 久久综合色之久久综合| 久久av高潮av| 四虎永久精品在线| 亚洲性生活视频在线观看| 久久精品第一页| 久久国产成人午夜av影院| 久久精品女人的天堂av| 深夜国产在线播放| 欧美日韩一区二区三区四区五区 | www.天堂在线| 国产精品嫩草影院com| av观看免费在线| 日韩最新在线| 午夜精品久久17c| 国产欧美第一页| 国产精品麻豆欧美日韩ww| 国产精品wwwww| 老司机在线精品视频| 欧美激情二区三区| 国产国语亲子伦亲子| 成人欧美一区二区三区小说| 91国产精品视频在线观看| 中文有码一区| 欧美综合第一页| 亚洲色图另类小说| 五月综合激情婷婷六月色窝| 免费观看污网站| 夜间精品视频| 亚洲一区二区中文| 超碰在线无需免费| 日韩一区二区不卡| 国产精品三区在线观看| 狠狠色狠狠色综合| av不卡在线免费观看| 91精品国产一区二区在线观看 | 亚洲一区二区三区四区| 亚洲片国产一区一级在线观看| 国产成人在线播放视频| 99久久精品国产麻豆演员表| 老太脱裤让老头玩ⅹxxxx| 加勒比视频一区| 97久久久久久| 国内三级在线观看| 在线观看三级视频欧美| 潮喷失禁大喷水aⅴ无码| 麻豆专区一区二区三区四区五区| 一区二区三区在线视频看| 欧美爱爱视频| 欧美成人在线免费| 色丁香婷婷综合久久| 精品久久久久久久久国产字幕| wwwwww日本| 麻豆国产精品一区二区三区| 黄色网zhan| 亚洲视频国产精品| 97在线看福利| av在线天堂| 日韩欧美一级特黄在线播放| 四虎永久在线精品| wwwwxxxxx欧美| 国产主播中文字幕| 欧美国产高清| 欧美午夜免费| 久久伊人久久| 5566成人精品视频免费| 最近高清中文在线字幕在线观看| 欧美一区二区三区免费在线看| jizz国产免费| 国产精品女主播av| 国产伦精品一区二区三区精品| 另类av一区二区| 国产精品啪啪啪视频| 羞羞色国产精品网站| 成人免费视频网| 高潮在线视频| 久久久成人av| 三级在线电影| 欧美一区二区三区的| 久久久久久91亚洲精品中文字幕| 国产精品高潮呻吟久久| 日韩aaaaa| 国精产品一区一区三区mba桃花 | 欧美成人精品激情在线观看| 亚洲AV成人无码一二三区在线| 欧美日韩激情在线| 男人天堂中文字幕| 亚洲男人天堂av网| 精品成人av一区二区三区| 国产精品18久久久| 精品999在线| 国产精品普通话对白| av磁力番号网| 凹凸成人精品亚洲精品密奴| 精品欧美一区二区精品久久| 国产一区一区| 国产精品中文字幕在线| 在线中文字幕播放| 欧美精品久久久久| а√天堂资源地址在线下载| 国产一区二区动漫| 亚洲 另类 春色 国产| 欧美变态口味重另类| 国产又粗又长视频| 在线观看三级视频欧美| 国产性xxxx高清| 亚洲综合免费观看高清完整版| 亚洲综合久久av一区二区三区| 久久女同性恋中文字幕| 小毛片在线观看| 国产酒店精品激情| 亚洲一二三av| 免费观看30秒视频久久| 精品www久久久久奶水| av成人激情| 中文字幕无码精品亚洲资源网久久| 国产韩日影视精品| 亚洲啪啪av| 日产精品一区二区| 色播五月综合| heyzo久久| 日本中文不卡| 禁断一区二区三区在线| 欧美亚洲另类久久综合| 亚洲系列另类av| 牛人盗摄一区二区三区视频| 性欧美xxxx免费岛国不卡电影| 久久99国产精品| 欧美三级午夜理伦三级小说| 久久国产一区| 少妇精品久久久一区二区| 欧美在线日韩精品| 欧洲激情综合| 亚洲视频在线二区| 欧美肥老太太性生活| 少妇高潮流白浆| 午夜日韩av| 成人毛片一区二区| 亚洲专区在线| 五月婷婷深爱五月| 久久99最新地址| 亚洲午夜精品在线观看| 国产91在线观看丝袜| 亚洲高清无码久久| 91丨九色丨黑人外教| 免费在线观看a视频| 国产精品久久久久久久蜜臀| 日本黄色激情视频| 亚洲人成7777| 国产一级中文字幕| 一本色道亚洲精品aⅴ| 中文字幕在线播出| 欧美一区二区三区在线看 | 色噜噜亚洲精品中文字幕| 国产在线激情视频| 欧美疯狂做受xxxx高潮| 成年男女免费视频网站不卡| 青青草99啪国产免费| 日韩专区视频| 国产精品10p综合二区| 亚洲人成网亚洲欧洲无码| 亚洲欧美精品| 黄色欧美日韩| www.日日操| 国产精品一区三区| 播金莲一级淫片aaaaaaa| 国产精品久久久久久久久免费丝袜 | 国产精品jizz在线观看麻豆| 在线播放成人| 看高清中日韩色视频| 99久久影视| 激情综合在线观看| 国产美女主播视频一区| 9.1成人看片| 1区2区3区国产精品| 国产精品午夜影院| 日韩一区二区在线观看视频播放| 婷婷av一区二区三区| 一区二区三区精品99久久| 欧美78videosex性欧美| 国产精品网红直播| 久久97精品| 最新视频 - x88av| 久久久久欧美精品| 国产精品入口麻豆| 亚洲欧洲制服丝袜| 波多野结衣av无码| 亚洲国产精品va在线看黑人| 巨大荫蒂视频欧美另类大| 欧美重口另类videos人妖| 免费观看在线一区二区三区| 欧美亚洲丝袜| 在线综合欧美| gogo亚洲国模私拍人体| 中文字幕中文字幕一区二区| 亚洲av中文无码乱人伦在线视色| 日韩欧美在线综合网| av播放在线| 日本久久久久久久| 国产精品高潮呻吟久久久久| 喜爱夜蒲2在线| 久久国产视频网| av网站免费在线看| 欧美日韩国产一区二区| 亚洲av无码国产精品久久不卡 | 国产在线观看www| 亚洲一区二区免费在线| 久久精品不卡| 久久99999| 国产日韩欧美综合一区| 国产精品视频免费播放| 亚洲激情视频网站| 黑人玩欧美人三根一起进| 999在线免费观看视频| 久久精品亚洲欧美日韩精品中文字幕| 少妇激情一区二区三区| 国产色综合久久| 国产黄网在线观看| 亚洲精品在线91| 一区一区三区| 久久综合毛片| 日韩精品免费专区| 性猛交ⅹxxx富婆video| 色呦呦日韩精品| 男人久久精品| 日本精品性网站在线观看| 亚洲色图丝袜| 黄色一级大片在线观看| 26uuu精品一区二区| 啦啦啦免费高清视频在线观看| 亚洲精品福利在线| 一区二区三区短视频| 欧美亚洲一级二级| 蜜臀精品一区二区三区在线观看| www中文在线| 91精品国模一区二区三区| 黄色网址在线免费观看| 亚洲综合色激情五月| 欧美日韩中文| 日本护士做爰视频| 黑人巨大精品欧美一区免费视频| 久久久资源网| 国产精品一二三视频| 久久精品久久久| youjizz.com日本| 欧美日韩免费网站| 国产黄色片在线播放| 国产精品一区二区久久久| 中文在线播放一区二区 | 少妇高潮一区二区三区| 日韩欧美精品在线观看视频| 国产欧美精品一区| 国产又粗又猛又爽又黄视频| 欧美黄色片在线观看| 国产一区调教| 国产三级三级三级看三级| 欧美国产欧美亚州国产日韩mv天天看完整| 一级特黄色大片| 欧美极品欧美精品欧美视频| 免费看久久久| 亚洲一级免费在线观看| 亚洲一区在线观看网站| 久久精品a一级国产免视看成人| 国产精品美女www| 欧美777四色影| 永久免费看mv网站入口78| 欧美日韩成人综合在线一区二区| 黄色影院在线看| 亚洲第一导航| 成人免费av资源| 中文字幕91爱爱| 性欧美在线看片a免费观看 | 99国产精品白浆在线观看免费| 91视频xxxx| www.香蕉视频| 国产精品免费久久久| 好看的亚洲午夜视频在线| 欧美午夜激情影院| 欧美xxx久久| 成人精品三级| 精品久久久久久久久久中文字幕| 中文字幕精品综合| 欧美 日韩 国产 在线| 国产精品人人做人人爽| 亚洲欧洲日本mm| 国产精品国产三级国产传播| 亚洲欧美成人网| gogo人体一区|