在SAP除了使用Cordova生產移動應用外,還有這種方式
- 2019 年 10 月 10 日
- 筆記
本文和Jerry過去的文章不太一樣,算不上Jerry的知識分享,只是記錄一下Jerry用React-Native把應用安裝到Android手機上遇到的一些問題,方便以後查看。
Jerry的同事Leo用React-Native開發了一個應用,現在Jerry需要把這個應用在自己的Android手機上運行起來。

客戶啟動這個應用後,自動召喚出手機上的攝影機,對身邊的物品進行拍照,然後把照片上傳到SAP Cloud Platform的Leonardo那裡,消費機器學習API之一的Similarity score服務,返回最相似的三個圖案。

去年Jerry的C4C開發團隊同事,Yang Joey曾經寫過一篇文章:SAP移動應用解決方案之一:HTML5應用 + Cordova = 平台相關的混合應用,介紹了SAP Cloud for Customer的移動端應用是怎麼基於開源項目Cordova創建的,當時文章曾經提及,使用Cordova打包成的移動應用,實際上運行在移動平台的WebView里。而React-Native則有著和Cordova完全不同的設計理念。

關於這兩種技術的比較,網上有很多的文章,大家根據關鍵字「React-Native Cordova」搜索就行了,比如這篇:
https://www.toptal.com/mobile/comparing-react-native-to-cordova

Jerry是按照React-Native中文網站一步一步操作的,過程中遇到一些問題,全都是和Android平台相關的,React-Native官網沒有提及,最後靠Google都順利解決了。

Could not resolve project: react-native-camera

Google找到一個鏈接:https://github.com/react-native-community/react-native-camera/blob/master/docs/migrationV2.md#android
需要在應用的android/app/build.gradle文件里添加一行配置:missingDimensionStrategy 'react-native-camera', 'general'

com.android.builder.testing.api.DeviceException: No connected devices!

這報錯資訊很清楚,React-Native cli不知道應該將打好包的應用安裝在什麼地方。解決方法也很容易,要麼啟動一個Android模擬器,要麼用USB連接真機。
用AVD manager啟動一個模擬器:

然後重新執行react-native run-android, 就能將應用安裝到模擬器上了。

或者用USB連接手機,打開手機上的USB調試選項:

一樣能夠通過react-native run-android將應用直接裝到手機上:

Failed to install the following Android SDK packages as some licences have not been accepted.

這個錯也容易解決,執行sdkmanager.bat –licenses, 一路選擇Y接受所有的licenses即可。

cannot find symbol import androidx.annotation.Nullable;

編譯錯誤。在應用的android文件夾的gradle.properties配置文件里,增加下面兩條配置記錄:
android.useAndroidX=true
android.enableJetifier=true

之後這個編譯錯誤就沒有了。

因為Leo開發的這個React-Native應用裡面可以用JavaScript程式碼調用手機攝影機,Jerry覺得非常神奇,出於好奇,打開Leo的程式碼學習了一下。
從react-native-camera庫里導出RNCamera組件:

到React-Native應用文件夾node_modules下查看RNCamera的實現,發現果然是根據移動作業系統的類型分別作了處理。如果是Android平台,使用攝影機對應的許可權為:PermissionsAndroid.PERMISSIONS.CAMERA

在Android平台下使用攝影機的Java程式碼,存放在對應的android文件夾里。

Jerry以前使用Cordova生產移動移動時,曾經研究過Cordova應用里的JavaScript程式碼是如何調用Android平台上原生的Java程式碼的,也在SAP社區上寫了一些文章:
這篇文章介紹的是如果發現Cordova提供的標準插件不能滿足我們的需求時,我們可以用Java開發自定義的Cordova插件,然後在JavaScript程式碼里調用。

Cordova里JavaScript程式碼調用Java程式碼的原理,Jerry在這三篇SAP社區部落格里介紹過:
- How is OData request routed to Offline data store by Odata offline plugin
- How is JavaScript code in OData offline plugin delegated to native Java code in Android
- How is OData offline store opened in Android platform
至於React-Native應用里的JavaScript程式碼是否通過同樣的原理調用Java程式碼,Jerry還沒有時間去研究,因為我下一步需要弄清楚如何使用React-Native基於Android平台打一個可以安裝的apk文件出來,這樣才能分發給其他同事測試。
感謝閱讀。
更多閱讀
- SAP移動應用解決方案之一:HTML5應用 + Cordova = 平台相關的混合應用
- SAP Fiori應用的三種部署方式