- Set
ANDROID_HOME. On Mac, this is usually:
export ANDROID_HOME=/Users/<username>/Library/Android/sdk
- Launch Android Device Monitor as below:
$ cd $ANDROID_HOME/tools
$ ./monitor &
-
Make sure you have enabled developer options and USB debugging on your Android phone. Connect your phone to your development machine.
-
Select your device from
Devicesview. -
Click on
LogCatview. All logs from device will get shown.
- Find PID of MyWard app as below:
$ cd $ANDROID_HOME/platform-tools
$ ./adb shell ps|grep org.mycity.myward | cut -c10-15
30067
- Filter log messages based on PID as below:
- In
LogCatview, click on the+button next toSaved Filters. - In the
LogCat Message Filter Settingsdialog, specify a name underFilter Name, and next toby PIDspecify the PID obtained above. - The new filter should get selected under
Saved Filtersand only the log messages specific to MyWard app should get shown inLogCatview. - To edit the PID at a later time, double click on your filter. This opens up the
LogCat Message Filter Settingsdialog and you can specify the new PID.
- In
- Problem:
BUILD FAILED error during Android release build.
$ ionic cordova build android --prod --release
...
BUILD FAILED
...
Error: .../Ionic-MFP-App/IonicMobileApp/platforms/android/gradlew: Command failed with exit code 1 Error output:
...
Warning: okhttp3.internal.huc.DelegatingHttpsURLConnection: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: okhttp3.internal.huc.DelegatingHttpsURLConnection: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: okhttp3.internal.huc.DelegatingHttpsURLConnection: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: okhttp3.internal.huc.OkHttpsURLConnection: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: okhttp3.internal.huc.OkHttpsURLConnection: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: okhttp3.internal.huc.OkHttpsURLConnection: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
Warning: there were 6 unresolved references to classes or interfaces.
You may need to add missing library jars or update their versions.
If your code works fine without the missing classes, you can suppress
the warnings with '-dontwarn' options.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':transformClassesAndResourcesWithProguardForRelease'.
...
[ERROR] An error occurred while running cordova build android --release (exit code 1).
Solution:
Make sure you have added following line at the end of IonicMobileApp/platforms/android/proguard-project-mfp.txt
-dontwarn okhttp3.internal.huc.**
- Problem:
After installing the release APK, when the app is launched, an Alert with text
java.lang.NoSuchMethodException: isAvailable [class org.json.JSONArray, class org.apache.cordova.CallbackContext]
is thrown as shown below.
If you ignore the alert and continue to run the app, you will notice that in Problem Detail page,
the problem location is not marked in Google Maps. Similarly in Report New Problem page,
clicking on GET MY LOCATION will have no effect.
Solution:
Make sure you have added following line at the end of IonicMobileApp/platforms/android/proguard-project-mfp.txt
-keep class plugin.google.maps.** { *; }
Related problem report that helped resolve this problem: mapsplugin/cordova-plugin-googlemaps#1152
- Problem:
After installing the release APK and the app is launched for the first time, trying to click on TAKE PHOTO button in Report New Problem page, crashes the app with message Unfortunately, MyWard has stopped.
LogCat shows following errors:
...
D/AndroidRuntime(25220): Shutting down VM
E/AndroidRuntime(25220): FATAL EXCEPTION: main
E/AndroidRuntime(25220): Process: org.mycity.myward, PID: 25220
E/AndroidRuntime(25220): java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=1, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {org.mycity.myward/org.mycity.myward.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
E/AndroidRuntime(25220): at android.app.ActivityThread.deliverResults(ActivityThread.java:5032)
E/AndroidRuntime(25220): at android.app.ActivityThread.handleSendResult(ActivityThread.java:5075)
E/AndroidRuntime(25220): at android.app.ActivityThread.access$1600(ActivityThread.java:229)
E/AndroidRuntime(25220): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1886)
E/AndroidRuntime(25220): at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime(25220): at android.os.Looper.loop(Looper.java:148)
E/AndroidRuntime(25220): at android.app.ActivityThread.main(ActivityThread.java:7402)
E/AndroidRuntime(25220): at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(25220): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
E/AndroidRuntime(25220): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
E/AndroidRuntime(25220): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
E/AndroidRuntime(25220): at android.support.v4.content.FileProvider.b(SourceFile:583)
E/AndroidRuntime(25220): at android.support.v4.content.FileProvider.a(SourceFile:557)
E/AndroidRuntime(25220): at android.support.v4.content.FileProvider.a(SourceFile:399)
E/AndroidRuntime(25220): at org.apache.cordova.camera.CameraLauncher.takePicture(SourceFile:295)
E/AndroidRuntime(25220): at org.apache.cordova.camera.CameraLauncher.onRequestPermissionResult(SourceFile:1315)
E/AndroidRuntime(25220): at org.apache.cordova.CordovaInterfaceImpl.onRequestPermissionResult(SourceFile:214)
E/AndroidRuntime(25220): at org.apache.cordova.CordovaActivity.onRequestPermissionsResult(SourceFile:508)
E/AndroidRuntime(25220): at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7291)
E/AndroidRuntime(25220): at android.app.Activity.dispatchActivityResult(Activity.java:7169)
E/AndroidRuntime(25220): at android.app.ActivityThread.deliverResults(ActivityThread.java:5028)
E/AndroidRuntime(25220): ... 9 more
E/com.worklight.common.a$f(25220): a$f.uncaughtException in SourceFile:449 :: Uncaught Exception
E/com.worklight.common.a$f(25220): java.lang.RuntimeException: Failure delivering result ResultInfo{who=@android:requestPermissions:, request=1, result=-1, data=Intent { act=android.content.pm.action.REQUEST_PERMISSIONS (has extras) }} to activity {org.mycity.myward/org.mycity.myward.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
E/com.worklight.common.a$f(25220): at android.app.ActivityThread.deliverResults(ActivityThread.java:5032)
E/com.worklight.common.a$f(25220): at android.app.ActivityThread.handleSendResult(ActivityThread.java:5075)
E/com.worklight.common.a$f(25220): at android.app.ActivityThread.access$1600(ActivityThread.java:229)
E/com.worklight.common.a$f(25220): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1886)
E/com.worklight.common.a$f(25220): at android.os.Handler.dispatchMessage(Handler.java:102)
E/com.worklight.common.a$f(25220): at android.os.Looper.loop(Looper.java:148)
E/com.worklight.common.a$f(25220): at android.app.ActivityThread.main(ActivityThread.java:7402)
E/com.worklight.common.a$f(25220): at java.lang.reflect.Method.invoke(Native Method)
E/com.worklight.common.a$f(25220): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
E/com.worklight.common.a$f(25220): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
E/com.worklight.common.a$f(25220): Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.ProviderInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
E/com.worklight.common.a$f(25220): at android.support.v4.content.FileProvider.b(SourceFile:583)
E/com.worklight.common.a$f(25220): at android.support.v4.content.FileProvider.a(SourceFile:557)
E/com.worklight.common.a$f(25220): at android.support.v4.content.FileProvider.a(SourceFile:399)
E/com.worklight.common.a$f(25220): at org.apache.cordova.camera.CameraLauncher.takePicture(SourceFile:295)
E/com.worklight.common.a$f(25220): at org.apache.cordova.camera.CameraLauncher.onRequestPermissionResult(SourceFile:1315)
E/com.worklight.common.a$f(25220): at org.apache.cordova.CordovaInterfaceImpl.onRequestPermissionResult(SourceFile:214)
E/com.worklight.common.a$f(25220): at org.apache.cordova.CordovaActivity.onRequestPermissionsResult(SourceFile:508)
E/com.worklight.common.a$f(25220): at android.app.Activity.dispatchRequestPermissionsResult(Activity.java:7291)
E/com.worklight.common.a$f(25220): at android.app.Activity.dispatchActivityResult(Activity.java:7169)
E/com.worklight.common.a$f(25220): at android.app.ActivityThread.deliverResults(ActivityThread.java:5028)
E/com.worklight.common.a$f(25220): ... 9 more
W/CursorWrapperInner(25220): Cursor finalized without prior close()
I/Process(25220): Sending signal. PID: 25220 SIG: 9
Reference: https://stackoverflow.com/questions/45938239/cordova-and-proguard-camera-plugin-npe-on-takepicture
Solution:
Edit IonicMobileApp/config.xml and add the following preference inside the <platform name="android"> tag:
<preference name="applicationId" value="org.mycity.myward" />
- Problem:
Application error. The connection to the server was unsuccessful upon app launch on certain devices.
Solution:
Edit IonicMobileApp/config.xml and add/edit the following preference inside the <platform name="android"> tag:
<preference name="loadUrlTimeoutValue" value="60000" />
- Problem:
Following warning during app build:
$ ionic cordova build android
...
Plugin doesn't support this project's cordova-plugman version. cordova-plugman: 8.0.0, failed version requirement: >=6.1.1 <8
Skipping 'cordova-plugin-mfp' for android.
...
If you ignore the above warning, and continue to run the app, then upon clicking SIGN IN in Login page, you will see following error in Logs:
vendor.js:1704 ERROR Error: Uncaught (in promise): ReferenceError: WLAuthorizationManager is not defined
ReferenceError: WLAuthorizationManager is not defined
at AuthHandlerProvider.webpackJsonp.41.AuthHandlerProvider.login (main.js:1027)
at main.js:1152
at t.invoke (polyfills.js:3)
at Object.onInvoke (vendor.js:4983)
at t.invoke (polyfills.js:3)
at r.run (polyfills.js:3)
at polyfills.js:3
at t.invokeTask (polyfills.js:3)
at Object.onInvokeTask (vendor.js:4974)
at t.invokeTask (polyfills.js:3)
Solution:
Downgrade your cordova version to one that is supported by cordova-plugin-mfp.
$ npm view cordova versions --json
$ npm install -g cordova@7.0.1
Remove Cordova platform for Android and add it again. Then build and run the app.
$ ionic cordova platform remove android
$ ionic cordova platform add android@6.3.0
$ ionic cordova build android
$ ionic cordova run android
- Problem:
Following runtime error when making a call to MobileFoundation adapter
Unhandled Promise rejection: Object {status: 400, statusText: "Bad Request",
responseText: "{"errorCode":"invalid_request"}", responseJSON: Object, responseHeaders: Object…} ;
This is due to compatibility issues between the client SDKs and the MobileFoundation Server.
Solution: Make sure you are using latest version of cordova-plugin-mfp and recreate your MobileFoundation service instance if needed.
- Problem:
In the Report New Problem page, when you click on GET MY LOCATION the app crashes with the following errors reported in logs.
Rejecting re-init on previously-failed class java.lang.Class<android.support.v4.app.FragmentActivity>
Shutting down VM
FATAL EXCEPTION: main
Process: org.mycity.myward, PID: 19050
java.lang.NoClassDefFoundError: android.support.v4.app.FragmentActivity
at com.google.android.gms.common.api.internal.zzce.zzajj(Unknown Source)
at com.google.android.gms.common.api.internal.LifecycleCallback.zzb(Unknown Source)
at com.google.android.gms.common.api.internal.LifecycleCallback.zzn(Unknown Source)
at com.google.android.gms.common.api.internal.zzah.zza(Unknown Source)
at com.google.android.gms.common.api.GoogleApi.<init>(Unknown Source)
at com.google.android.gms.common.api.GoogleApi.<init>(Unknown Source)
at com.google.android.gms.location.FusedLocationProviderClient.<init>(Unknown Source)
at com.google.android.gms.location.LocationServices.getFusedLocationProviderClient(Unknown Source)
at plugin.google.maps.PluginLocationService._requestLocationUpdate(PluginLocationService.java:451)
at plugin.google.maps.PluginLocationService.requestLocation(PluginLocationService.java:279)
at plugin.google.maps.PluginLocationService.access$300(PluginLocationService.java:39)
at plugin.google.maps.PluginLocationService$3.onConnected(PluginLocationService.java:234)
at com.google.android.gms.common.internal.zzae.zzk(Unknown Source)
at com.google.android.gms.common.api.internal.zzba.zzj(Unknown Source)
at com.google.android.gms.common.api.internal.zzao.zzaie(Unknown Source)
at com.google.android.gms.common.api.internal.zzao.onConnected(Unknown Source)
at com.google.android.gms.common.api.internal.zzbi.onConnected(Unknown Source)
at com.google.android.gms.common.api.internal.zzt.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzac.onConnected(Unknown Source)
at com.google.android.gms.common.internal.zzn.zzakr(Unknown Source)
at com.google.android.gms.common.internal.zze.zzw(Unknown Source)
at com.google.android.gms.common.internal.zzi.zzaks(Unknown Source)
at com.google.android.gms.common.internal.zzh.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7402)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Solution: This is usually due to an incompatible configuration/version of Cordova plugin for GoogleMaps. Remove the plugin and add it again to resolve this problem.
$ cordova plugin remove cordova-plugin-googlemaps
$ cordova plugin add cordova-plugin-googlemaps --variable API_KEY_FOR_ANDROID=“your-api-key-for-android”
Remove Android platform and add it again to pickup the changes.
$ ionic cordova platform remove android
$ ionic cordova platform add android@6.3.0
$ ionic cordova run android
