成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

React Native中的Android原生模塊

移動開發 Android
當使用 React Native 開發 Android 應用時,你可能需要使用沒有被 React Native 封裝的模塊。但你可以使用 Java 編寫原生模塊,然后選擇性的暴露公共接口到 React Native。

[[176954]]

當使用 React Native 開發 Android 應用時,你可能需要使用沒有被 React Native 封裝的模塊。但你可以使用 Java 編寫原生模塊,然后選擇性的暴露公共接口到 React Native。一起來試一下!

我們要寫一個什么東西

在寫這篇文章時,React Native 包含了 ImagePickerIOS 組件,但是在 Android 平臺上卻沒有對應的 ImagePicker 組件。我們接下來就要為 Android 構建一個簡單的、和 ImagePickerIOS 大致相仿的 ImagePicker。 

編寫一個 React Native 的 Android 原生模塊需要以下步驟:

  1. 創建一個 ReactPackage,把很多模塊(Native 和 Javascript)包含在一起,然后在 MainActivity 中的 getPackages 方法引用。
  2. 創建一個 Java 類,繼承 ReactContextBaseJavaModule 并實現需要的接口,然后注冊到我們的 ReactPackage。
  3. 覆寫上述類的 getName 方法,這個方法會作為 Javascript 的調用方法名。
  4. 使用 @ReactMethod 注解把需要的公共方法暴露給 Javascript。
  5. ***,在 Javascript 中通過 NativeModules 導入你的模塊。

讓我們一起實踐一下。

創建一個 ReactPackage

啟動 AndroidStudio 并且導航到 MyApp/android/app/src/main/java/com/myapp/MainActivity.java。它應該看起來像這樣:

  1. package com.myapp; 
  2.  
  3. import com.facebook.react.ReactActivity; 
  4. import com.facebook.react.ReactPackage; 
  5. import com.facebook.react.shell.MainReactPackage; 
  6.  
  7. import java.util.Arrays; 
  8. import java.util.List; 
  9.  
  10. public class MainActivity extends ReactActivity { 
  11.  
  12.     @Override 
  13.     protected String getMainComponentName() { 
  14.         return "MyApp"
  15.     } 
  16.  
  17.     @Override 
  18.     protected boolean getUseDeveloperSupport() { 
  19.         return BuildConfig.DEBUG; 
  20.     } 
  21.  
  22.     @Override 
  23.     protected List<ReactPackage> getPackages() { 
  24.         return Arrays.<ReactPackage>asList( 
  25.             new MainReactPackage() 
  26.         ); 
  27.     } 
  28.  

我們先來引入一個尚未定義的包:

  1. import com.myapp.imagepicker.*; // import the package 
  2.  
  3. public class MainActivity extends ReactActivity { 
  4.     @Override 
  5.     protected List<ReactPackage> getPackages() { 
  6.         return Arrays.<ReactPackage>asList( 
  7.             new MainReactPackage(), 
  8.             new ImagePickerPackage() // include it in getPackages 
  9.         ); 
  10.     } 
  11.  

現在我們來編寫那個包。我們將會為它創建一個叫 imagepicker 的新目錄并且寫入 ImagePickerPackage:

  1. package com.myapp.imagepicker; 
  2.  
  3. import com.facebook.react.ReactPackage; 
  4. import com.facebook.react.bridge.JavaScriptModule; 
  5. import com.facebook.react.bridge.NativeModule; 
  6. import com.facebook.react.bridge.ReactApplicationContext; 
  7. import com.facebook.react.uimanager.ViewManager; 
  8.  
  9. import java.util.ArrayList; 
  10. import java.util.Collections; 
  11. import java.util.List; 
  12.  
  13. public class ImagePickerPackage implements ReactPackage { 
  14.     @Override 
  15.     public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { 
  16.         List<NativeModule> modules = new ArrayList<>(); 
  17.  
  18.         modules.add(new ImagePickerModule(reactContext)); 
  19.  
  20.         return modules; 
  21.     } 
  22.  
  23.     @Override 
  24.     public List<Class<? extends JavaScriptModule>> createJSModules() { 
  25.         return Collections.emptyList(); 
  26.     } 
  27.  
  28.     @Override 
  29.     public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { 
  30.         return Collections.emptyList(); 
  31.     } 
  32.  

現在我們已經創建了一個包并且包含進 MainActivity 中了。

創建一個 ReactContextBaseJavaModule

我們將會以創建 ImagePickerModule 開始,繼承 ReactContextBaseJavaModule。

  1. package com.myapp.imagepicker; 
  2.  
  3. import com.facebook.react.bridge.ReactContextBaseJavaModule; 
  4.  
  5. public class ImagePickerModule extends ReactContextBaseJavaModule { 
  6.     public ImagePickerModule(ReactApplicationContext reactContext) { 
  7.         super(reactContext); 
  8.     } 
  9.  

這是一個好的開始,為了 React Native 能從 NativeModules 找到我們的模塊,我們需要覆寫 getName 方法。

  1. @Override 
  2. public String getName() { 
  3.     return "ImagePicker"
  4.  

我們現在有了一個可以被 JavaScript 代碼導入的 native 模塊,讓它做些有趣的事情吧。

暴露方法

ImagePickerIOS 定義了 openSelectDialog 方法,可以傳遞配置對象、失敗、成功的回調。讓我們在 ImagePickerModule 中定義一個相似的方法。

  1. import com.facebook.react.bridge.Callback; 
  2. import com.facebook.react.bridge.ReadableMap; 
  3.  
  4. public class ImagePickerModule extends ReactContextBaseJavaModule { 
  5.     @ReactMethod 
  6.     public void openSelectDialog(ReadableMap config, Callback successCallback, Callback cancelCallback) { 
  7.         Activity currentActivity = getCurrentActivity(); 
  8.      
  9.         if (currentActivity == null) { 
  10.             cancelCallback.invoke("Activity doesn't exist"); 
  11.             return
  12.         } 
  13.     } 
  14.  

這里我們從 React Native 中導入了 Callback 和 ReadableMap 來對應 JavaScript 中的 function 和 object。我們為這個方法加上@ReactMethod 注解,從而使它作為 ImagePicker 的一部分被 JavaScript 引用。

在方法體中我們獲取當前的 activity,如果沒有獲取到 activity,就調用 cancel 的回調方法。我們現在有了一個可以運行的方法,但是它還不能做任何有趣的事情。讓我們用它打開相冊。

  1. public class ImagePickerModule extends ReactContextBaseJavaModule { 
  2.     private static final int PICK_IMAGE = 1; 
  3.  
  4.     private Callback pickerSuccessCallback; 
  5.     private Callback pickerCancelCallback; 
  6.  
  7.     @ReactMethod 
  8.     public void openSelectDialog(ReadableMap config, Callback successCallback, Callback cancelCallback) { 
  9.         Activity currentActivity = getCurrentActivity(); 
  10.  
  11.         if (currentActivity == null) { 
  12.             cancelCallback.invoke("Activity doesn't exist"); 
  13.             return
  14.         } 
  15.  
  16.         pickerSuccessCallback = successCallback; 
  17.         pickerCancelCallback = cancelCallback; 
  18.  
  19.         try { 
  20.             final Intent galleryIntent = new Intent(); 
  21.  
  22.             galleryIntent.setType("image/*"); 
  23.             galleryIntent.setAction(Intent.ACTION_GET_CONTENT); 
  24.  
  25.             final Intent chooserIntent = Intent.createChooser(galleryIntent, "Pick an image"); 
  26.  
  27.             currentActivity.startActivityForResult(chooserIntent, PICK_IMAGE); 
  28.         } catch (Exception e) { 
  29.             cancelCallback.invoke(e); 
  30.         } 
  31.     } 
  32.  

首先,我們設置了回調,然后,我們創建了一個 Intent 并把它傳遞給 startActivityForResult。***,我們把所有的東西都放在 try/catch 塊中來處理可能發生的異常。

當你調用 openSelectDialog 時,你應該可以看到一個相冊了。然而,當你選擇一張圖片時,相冊并不做任何事情。為了能夠處理圖片數據,我們需要在模塊中處理 activity 的返回值。

首先,我們需要在 react context 中添加 activity event listener:

  1. public class ImagePickerModule extends ReactContextBaseJavaModule implements ActivityEventListener { 
  2.     public ImagePickerModule(ReactApplicationContext reactContext) { 
  3.         super(reactContext); 
  4.         reactContext.addActivityEventListener(this); 
  5.     } 
  6.  

現在我們可以獲取到相冊返回的數據了。

  1. @Override 
  2. public void onActivityResult(final int requestCode, final int resultCode, final Intent intent) { 
  3.     if (pickerSuccessCallback != null) { 
  4.         if (resultCode == Activity.RESULT_CANCELED) { 
  5.             pickerCancelCallback.invoke("ImagePicker was cancelled"); 
  6.         } else if (resultCode == Activity.RESULT_OK) { 
  7.             Uri uri = intent.getData(); 
  8.  
  9.             if (uri == null) { 
  10.                 pickerCancelCallback.invoke("No image data found"); 
  11.             } else { 
  12.                 try { 
  13.                     pickerSuccessCallback.invoke(uri); 
  14.                 } catch (Exception e) { 
  15.                     pickerCancelCallback.invoke("No image data found"); 
  16.                 } 
  17.             } 
  18.         } 
  19.     } 
  20.  

在這里我們應該可以通過 success callback 獲取到圖片 URI。

  1. NativeModules.ImagePicker.openSelectDialog( 
  2.   {}, // no config yet  
  3.   (uri) => { console.log(uri) },  
  4.   (error) => { console.log(error) } 
  5.  

為了和 ImagePickerIOS 的表現大致相仿,我們可以允許用戶選擇圖片、視頻或者直接打開相機。這些功能的寫法和上面基本一致,我們將會把它留給讀者作為練習。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2018-06-13 16:38:33

React Nativ組件Android

2015-09-22 09:50:36

FacebookAndroid

2017-01-04 10:18:00

React NativScrollViewAndroid

2015-03-30 12:13:23

React NativiOS

2015-10-10 16:02:36

React NativAndroid

2017-06-20 12:48:55

React Nativ自定義模塊Note.js

2016-10-13 19:01:59

React NativUbuntu

2017-09-11 14:35:34

編輯器開發環境React

2016-08-12 08:49:46

React NativFacebookNative

2016-08-12 13:55:06

2023-06-24 17:09:06

React前端

2024-07-08 00:00:07

2023-01-29 08:00:00

Instagram濾鏡圖片編輯

2017-01-11 18:44:43

React Nativ觸摸事件Android

2019-08-19 08:14:52

深度鏈接iOSAndroid

2022-07-28 14:33:32

webviewweb頁面

2017-01-09 16:40:07

React NatiAndroid 開發

2016-08-15 13:34:37

React NativiOSjs入口

2017-03-09 13:29:04

ReactNative JSPatch

2017-03-21 21:37:06

組件UI測試架構
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久婷婷色 | 日韩中文字幕网 | 成人精品久久日伦片大全免费 | 欧美精品tv | 午夜影院黄 | 国产亚洲黄色片 | 久久久国产精品网站 | 日韩成人免费 | 天天拍天天操 | 91精品中文字幕一区二区三区 | 成人高清在线视频 | 亚洲精品一二三 | 国产一区免费视频 | 久久久国产精品一区 | 精品免费国产一区二区三区 | 日韩视频在线观看中文字幕 | 天天人人精品 | 妖精视频一区二区三区 | 中文字幕中文字幕 | 精品在线一区 | 日韩精品专区在线影院重磅 | 99精品久久 | 欧美一级片在线观看 | 亚洲精品欧美一区二区三区 | 中文字幕亚洲无线 | 午夜精品视频在线观看 | 可以在线观看av的网站 | 久久精品视频免费观看 | 久久久精彩视频 | 国产精品久久久久久久久久久久久 | 亚洲三区视频 | 日韩五月天 | 精品久久久久久国产 | 亚洲精品久久久久久一区二区 | 欧美一级小视频 | 久久精品视频在线观看 | 91九色在线观看 | 久久国产欧美日韩精品 | 国产欧美精品一区二区三区 | 中文精品视频 | 自拍偷拍在线视频 |