ReactNative中的Android原生模塊怎么創(chuàng)建

這篇文章主要介紹“React Native中的Android原生模塊怎么創(chuàng)建”,在日常操作中,相信很多人在React Native中的Android原生模塊怎么創(chuàng)建問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”React Native中的Android原生模塊怎么創(chuàng)建”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)專注于六安企業(yè)網(wǎng)站建設,成都響應式網(wǎng)站建設,商城網(wǎng)站制作。六安網(wǎng)站建設公司,為六安等地區(qū)提供建站服務。全流程定制設計,專業(yè)設計,全程項目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務

創(chuàng)建一個 ReactPackage

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

package com.myapp;  import com.facebook.react.ReactActivity; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage;  import java.util.Arrays; import java.util.List;  public class MainActivity extends ReactActivity {      @Override     protected String getMainComponentName() {         return "MyApp";     }      @Override     protected boolean getUseDeveloperSupport() {         return BuildConfig.DEBUG;     }      @Override     protected List<ReactPackage> getPackages() {         return Arrays.<ReactPackage>asList(             new MainReactPackage()         );     } }

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

import com.myapp.imagepicker.*; // import the package  public class MainActivity extends ReactActivity {     @Override     protected List<ReactPackage> getPackages() {         return Arrays.<ReactPackage>asList(             new MainReactPackage(),             new ImagePickerPackage() // include it in getPackages         );     } }

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

package com.myapp.imagepicker;  import com.facebook.react.ReactPackage; import com.facebook.react.bridge.JavaScriptModule; import com.facebook.react.bridge.NativeModule; import com.facebook.react.bridge.ReactApplicationContext; import com.facebook.react.uimanager.ViewManager;  import java.util.ArrayList; import java.util.Collections; import java.util.List;  public class ImagePickerPackage implements ReactPackage {     @Override     public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {         List<NativeModule> modules = new ArrayList<>();          modules.add(new ImagePickerModule(reactContext));          return modules;     }      @Override     public List<Class<? extends JavaScriptModule>> createJSModules() {         return Collections.emptyList();     }      @Override     public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {         return Collections.emptyList();     } }

現(xiàn)在我們已經(jīng)創(chuàng)建了一個包并且包含進 MainActivity 中了。

創(chuàng)建一個 ReactContextBaseJavaModule

我們將會以創(chuàng)建 ImagePickerModule 開始,繼承 ReactContextBaseJavaModule。

package com.myapp.imagepicker;  import com.facebook.react.bridge.ReactContextBaseJavaModule;  public class ImagePickerModule extends ReactContextBaseJavaModule {     public ImagePickerModule(ReactApplicationContext reactContext) {         super(reactContext);     } }

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

@Override public String getName() {     return "ImagePicker"; }

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

暴露方法

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

import com.facebook.react.bridge.Callback; import com.facebook.react.bridge.ReadableMap;  public class ImagePickerModule extends ReactContextBaseJavaModule {     @ReactMethod     public void openSelectDialog(ReadableMap config, Callback successCallback, Callback cancelCallback) {         Activity currentActivity = getCurrentActivity();              if (currentActivity == null) {             cancelCallback.invoke("Activity doesn't exist");             return;         }     } }

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

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

public class ImagePickerModule extends ReactContextBaseJavaModule {     private static final int PICK_IMAGE = 1;      private Callback pickerSuccessCallback;     private Callback pickerCancelCallback;      @ReactMethod     public void openSelectDialog(ReadableMap config, Callback successCallback, Callback cancelCallback) {         Activity currentActivity = getCurrentActivity();          if (currentActivity == null) {             cancelCallback.invoke("Activity doesn't exist");             return;         }          pickerSuccessCallback = successCallback;         pickerCancelCallback = cancelCallback;          try {             final Intent galleryIntent = new Intent();              galleryIntent.setType("image/*");             galleryIntent.setAction(Intent.ACTION_GET_CONTENT);              final Intent chooserIntent = Intent.createChooser(galleryIntent, "Pick an image");              currentActivity.startActivityForResult(chooserIntent, PICK_IMAGE);         } catch (Exception e) {             cancelCallback.invoke(e);         }     } }

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

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

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

public class ImagePickerModule extends ReactContextBaseJavaModule implements ActivityEventListener {     public ImagePickerModule(ReactApplicationContext reactContext) {         super(reactContext);         reactContext.addActivityEventListener(this);     } }

現(xiàn)在我們可以獲取到相冊返回的數(shù)據(jù)了。

@Override public void onActivityResult(final int requestCode, final int resultCode, final Intent intent) {     if (pickerSuccessCallback != null) {         if (resultCode == Activity.RESULT_CANCELED) {             pickerCancelCallback.invoke("ImagePicker was cancelled");         } else if (resultCode == Activity.RESULT_OK) {             Uri uri = intent.getData();              if (uri == null) {                 pickerCancelCallback.invoke("No image data found");             } else {                 try {                     pickerSuccessCallback.invoke(uri);                 } catch (Exception e) {                     pickerCancelCallback.invoke("No image data found");                 }             }         }     } }

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

NativeModules.ImagePicker.openSelectDialog(   {}, // no config yet    (uri) => { console.log(uri) },    (error) => { console.log(error) } )

到此,關于“React Native中的Android原生模塊怎么創(chuàng)建”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

本文標題:ReactNative中的Android原生模塊怎么創(chuàng)建
本文來源:http://www.muchs.cn/article44/ijsjee.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設計公司定制網(wǎng)站、面包屑導航云服務器、動態(tài)網(wǎng)站、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

綿陽服務器托管