簡體   English   中英

如何通過React Native的意圖啟動和接收其他應用程序的輸出?

[英]How to launch and receive output from another app through intent in react native?

我已經使用VSCode創建了react native應用程序,現在,我必須使用micro USB主機集成讀取器設備。

我已安裝閱讀器應用程序以測試APK。 基於網絡,我可以通過當前應用程序的意圖調用閱讀器應用程序。 設備Web鏈接在這里

目前,我已經嘗試通過意圖調用本機應用程序的搜索教程。 但是我陷入了腳本編寫的困境。 我要么應該創建新文件,要么將腳本粘貼到現存目錄下/將現存./android/app/src/main/java/com/myAppName/MainApplication.java替換為./android/app/src/main/java/com/myAppName/MainApplication.java以及如何在中調用和接收來自我的掃描儀類的輸出./src/screens/scanScreens/mainScanner.js

以下是我所經歷的,但留着下一步應該做的事情:-

  1. 本機模塊
  2. 將React-Native模塊集成到現有的Native App(Android)中
  3. 在Android上與React Native進行應用間通信
  4. 堆棧接受的答案
  5. 反應本機意圖發射器

我目前的MainActivity.java [更新]

package com.myappname;

import com.facebook.react.ReactActivity;
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;

public class MainActivity extends ReactActivity {

    /**
     * Returns the name of the main component registered from JavaScript.
     * This is used to schedule rendering of the component.
     */
    @Override
    protected String getMainComponentName() {
        return "myAppName";
    }

    @Override
    protected ReactActivityDelegate createReactActivityDelegate() {
        return new ReactActivityDelegate(this, getMainComponentName()) {
        @Override
        protected ReactRootView createRootView() {
        return new RNGestureHandlerEnabledRootView(MainActivity.this);
        }
        };
    }
}
public class ShowKadModule extends ReactContextBaseJavaModule {

    @ReactMethod
    public void showKadApp() {
        final Activity activity = getCurrentActivity();
        Intent intent = new Intent ("com.causalidea.cikad.showkad.READ_MYKAD");
        Bundle extras = new Bundle ();
        extras.putBoolean ("READ_PHOTO", false); // Do not read the photo
        intent.putExtras (extras);
        activity.startActivityForResult (intent, 0); 
     }
     public ShowKadModule(ReactApplicationContext reactContext) {
        super(reactContext);
        // Add the listener for `onActivityResult`
        reactContext.addActivityEventListener(mActivityEventListener);
      }

      @Override
      public String getName() {
        return "ShowKadModule";
      }
     @Override
     public void onActivityResult(int requestCode, int resultCode, final Intent data) {
        if (resultCode == Activity.RESULT_OK) {
            extras = intent.getExtras ();

            if (extras != null) {
                extras.getString ("IC_NUMBER");
                extras.getString ("NAME");
                extras.getString ("GENDER");
                extras.getString ("CITIZENSHIP");

                extras.getString ("BIRTH_DATE");
                extras.getString ("RACE");
                extras.getString ("RELIGION");

                extras.getString ("ADDRESS_1");
                extras.getString ("ADDRESS_2");
                extras.getString ("ADDRESS_3");
                extras.getString ("POSTCODE");
                extras.getString ("CITY");
                extras.getString ("STATE");

                photoByteArray = extras.getByteArray ("PHOTO");

                if (photoByteArray != null) {
                    bitmap = BitmapFactory.decodeByteArray (photoByteArray, 0, photoByteArray.length);
                    imageView.setImageBitmap (bitmap);
                }
            }
        } else if (resultCode == Activity.RESULT_CANCELED) {

        }
     }
}

經過大量示例和教程之后,我找到了一個簡單的解決方案。 通過從此處安裝react-native-activity-result。

我如何執行此操作如下:

import ActivityResult from 'react-native-activity-result';

_onLaunch = async () => {
    const activity = await ActivityResult.resolveActivity('com.causalidea.cikad.showkad.READ_MYKAD');
    if (!activity) {
        console.warn('Please install the othe app.');
        ToastAndroid.show(`MyKAD application reader is not install`, ToastAndroid.SHORT, ToastAndroid.BOTTOM);
    } else {
        console.log(`Activity will be handled by ${activity.package}`);
        ToastAndroid.show(`Activity will be handled by ${activity.package}`, ToastAndroid.SHORT, ToastAndroid.BOTTOM);
    }

    // Start an activity for a result
    let uniqueId = 0;
    let args = {READ_PHOTO: false};
    ToastAndroid.show(`Test`, ToastAndroid.SHORT, ToastAndroid.BOTTOM);
    const response = await ActivityResult.startActivityForResult(uniqueId, 'com.causalidea.cikad.showkad.READ_MYKAD', args);
    ToastAndroid.show(`Result code: ${response.resultCode}`, ToastAndroid.LONG, ToastAndroid.BOTTOM);


    if (response.resultCode !== ActivityResult.OK) {
        ToastAndroid.show(`Invalid result from activity.`, ToastAndroid.SHORT, ToastAndroid.BOTTOM);
        throw new Error('Invalid result from activity.');
    } else {
        console.log('Got the following response: ' + response.data);
        ToastAndroid.show(`Response:\n${JSON.stringify(response)}`, ToastAndroid.SHORT, ToastAndroid.BOTTOM);
    }

    // Finish an activity with a result. This will close the caller too.
    //ActivityResult.finish(ActivityResult.OK, 'com.causalidea.cikad.showkad.READ_MYKAD', args);
}

我可以啟動另一個應用程序並等待活動結果,然后它會相應地工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM