Xamarin Android app crashes when using GCM - google-cloud-messaging

Im following the tutorial to add Google Cloud Messaging to your xamarin android project (Walkthrough - Using Remote Notifications in Xamarin.Android).
But im having trouble trying to connect to Google Services.
Everytime i try to build/ run my app, Visual Studio just trys to launch the app but then stops about a second later.
Heres the output message:
Android application is debugging. The application could not be
started. Ensure that the application has been installed to the target
device and has a launchable activity (MainLauncher = true).
Additionally, check Build->Configuration Manager to ensure this
project is set to Deploy for this configuration.
Here is my manifest file also:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="PushNotificationsAndroid.PushNotificationsAndroid"
android:versionCode="1"
android:versionName="1.0"
android:installLocation="auto">
<uses-sdk android:minSdkVersion="16" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.INTERNET" />
<user-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:name="PushNotificationsAndroid.PushNotificationsAndroid.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="PushNotificationsAndroid.PushNotificationsAndroid.permission.C2D_MESSAGE" />
<application android:label="PushNotificationsAndroid"></application>
</manifest>
I commented out some of the permission lines and this issue seems just to happen when i added the line:
<permission android:name="PushNotificationsAndroid.PushNotificationsAndroid.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
Can anyone give me some advice to why this is happening?

Found a solution. I just had to make the package name lowercase for some reason
com.notifications.pushnotificationsandroid

Related

Android EMM AppConfig

I am trying to setup AppConfig variables through our EMM server for an internal-only app.
I have reviewed the documentation "Set up managed configurations" here https://developer.android.com/work/managed-configurations and verified that my AndroidManifest.xml and app_restrictions.xml files are correctly populated.
AndroidManifesst.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<application>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="#xml/file_paths"></meta-data>
<meta-data
android:name="android.content.APP_RESTRICTIONS"
android:resource="#xml/app_restrictions"></meta-data>
</provider>
</application>
...
</manifest>
app_restrictions.xml:
<?xml version="1.0" encoding="utf-8"?>
<restrictions xmlns:android="http://schemas.android.com/apk/res/android">
<restriction
android:key="app_configurator"
android:title="#string/app_configurator"
android:restrictionType="bool"
android:defaultValue="false">
</restriction>
<restriction
android:key="z_number"
android:title="#string/z_number"
android:restrictionType="string"
android:defaultValue="Testing123">
</restriction>
</restrictions>
In testing, using the Test DPC app with Device Owner:
the button "LOAD APP MANIFEST RESTRICTIONS" does nothing (when I expect it should load the details defined in app_restrictions.xml)
if I manually add the keys and values my app responds as expected
When publishing, through Managed Google Play and setting up the app from our EMM solution:
the app configuration tab is not populated with any parameters and a message "This app doesn't support app configuration." is shown leaving no way to configure the app.
Given that the app does respond when the values are set, but the inability to set the values seems to indicate the Test DPC and the EMM solution cannot read the values of my app_restrictions.xml.
The documentation indicates that the above two files are all that is needed. However, I have seen some reference to Google Play services providing this information to MDMs so I'm not sure I understand the process here to investigate further.
Hoping someone could help me with some pointers.
In the AndroidManifest.xml file, the location of the 'meta-data' tag is incorrect. The issue is resolved after the following update:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<application>
<meta-data
android:name="android.content.APP_RESTRICTIONS"
android:resource="#xml/app_restrictions"></meta-data>
...
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="#xml/file_paths"></meta-data>
</provider>
</application>
...
</manifest>

How to remove "android.hardware.location" permission request from ejected Expo project?

I have an React Native Expo project that started out using the Expo "managed workflow". However, since then I have ejected out of the managed workflow (while still using some expo modules).
The issue I'm experiencing is that Expo seems to have added arbitrary permission requests to my Android app.
I must remove this particular permission request from the app: android.hardware.location.
I've tried many ways to remove it in my AndroidManifest.xml file, for example:
<uses-permission tools:node="remove" android:name="LOCATION_HARDWARE" />
<uses-permission tools:node="remove" android:name="ACCESS_COARSE_LOCATION" />
<uses-permission tools:node="remove" android:name="ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location" android:required="false" tools:node="remove" />
But in the end the bundled Android app still requests the android.hardware.location permission.
How can I remove it before bundling the app?
for excluding any permission that expo is adding automatically, according to the expo documentation you should just add tools:node="remove" to your manifest permission element. now if you want to remove location permission this should solve your issue:
<manifest ... xmlns:tools="http://schemas.android.com/tools">
...
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" tools:node="remove" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="remove" />
...
</manifest>
By adding these, hardware location permission should be gone too.
don't forget to add tools namespace to the root element of your manifest
This issue was resolved by removing the expo dependency from package.json.
The expo dependency required expo-location which in turn requested various android location permissions.

Why my rebuilded openfl/lime 2.9.1 for haxeflixel always ingores my own androidmanifest uses permissions?

I use haxeflixel that create lime build android applications.
I rebuild lime 2.9.1 from source that lime can make android target sdk version 26, as google said soon be minimum version for playstore. This is the original article .
As result i can make lime build android with android target sdk api version 26.
-Project.xml <android minimum-sdk-version="9" if="android" /> <android target-sdk-version="26" if="android" />
-AndroidManifest.xml <uses-sdk android:minSdkVersion="9" android:targetSdkVersion="26"/>
But, now lime always ignores my own AndroidManifest.xml
-Project.xml <template path="assets/data/AndroidManifest.xml" rename="AndroidManifest.xml" if="android"/>
as result, my apk in time of installation show me "app no need special permissions". But my own AndroidManifest.xml have syntax
AndroidManifest.xml
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
If i switch lime version to "prebuilded lime 2.9.1" installed by default in haxeflixel , which can't make android target sdk version 26, but can only 19, then all work normal. In time of apk installing process i see the messages about require special permissions for app, and android app work as expected.
I test it on both windows / linux , the result is same. Prebuilded lime work done, but rebuilded lime ingnore all uses permissions, but use rebuilded lime i still can set portrait/landscape screen orientation inside my own AndroidManifest.xml.
How fix ingnoring android uses permissions from rebuilded lime side?
Have you tried putting the permissions into the Project.hxml? Something like:
<android permission="android.permission.WRITE_EXTERNAL_STORAGE" />
<android permission="android.permission.ACCESS_NETWORK_STATE"/>
<android permission="android.permission.INTERNET"/>
<android permission="android.permission.WAKE_LOCK"/>
<android permission="android.permission.VIBRATE"/>
<android permission="android.permission.READ_EXTERNAL_STORAGE"/>

MonoAndroid versions - which to use?

I'm a bit confused about MonoAndroid versions related to SDK and JDK.
I'm trying to add Xamarin.Android.Support.v7.AppCompat but installation fails because it seems that is installing AppCompat 25.1.1 with MonoAndroid Version v6.0.
What is the problem?
This is my Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="HCApp.HCApp" android:versionCode="1" android:versionName="1.0" android:installLocation="auto">
<uses-sdk android:minSdkVersion="19" android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:label="HCApp" android:theme="#style/HCTheme" android:icon="#drawable/Icon"></application>
</manifest>
Thank you!

NoClassDefFoundError Google-Play-Services / Maps

Getting NoClassDefFoundError within project and in Google Maps for Android sample found in google-play-services folder.
I have tried so far:
Importing google-play-services_lib into workspace through wizard and making sure code is copied to directory
Manually copying google-play-services_lib into directory with sample, then importing into workspace
Copying jar into workspace
Google Play Services is installed on test devices (Nexus 5, Galaxy S4)
There is a green check next to the library under my project when going to properties > android
I can see the classes in source at compile time, compiles with no errors
Reinstalled the lib from the Android SDK Manager and made sure the key is correct in Google API console; also made sure v2 of maps was enabled for that key
Added proguard exceptions as per integration instructions
Any ideas?
Manifest:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.package.projectname"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="18"
android:targetSdkVersion="21" />
<permission
android:name="com.package.projectname.permission.MAPS_RECEIVE"
android:protectionLevel="signature" />
<uses-permission android:name="com.package.projectname.permission.MAPS_RECEIVE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="com.package.projectname.gsf.permission.READ_GSERVICES" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature
android:glEsVersion="0x00020000"
android:required="true" />
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="#string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.package.projectname.MapActivity"
android:label="#string/title_activity_map"
android:parentActivityName="com.package.projectname.MainActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.package.projectname.MainActivity" />
</activity>
<uses-library
android:name="com.google.android.maps"
android:required="true" />
<meta-data
android:name="com.google.android.gms.version"
android:value="#integer/google_play_services_version" />
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value=“my_key_from_google_api_console” />
</application>
</manifest>
I don't think you need the line:
<uses-library
android:name="com.google.android.maps"
android:required="true" />
In fact, I think that's the name of the old maps library. Try removing it and see if that fixes your problem. Also, make sure your code is importing from com.google.android.gms.maps and com.google.android.gms.maps.model, the packages for Google Maps API V2.
UPDATE
Your build configuration isn't including the Google Play Services jar in your APK.
To fix this in IntelliJ: https://stackoverflow.com/a/17977734/1235702
To fix this in Eclipse, follow steps 3 and 4 here: https://docs.google.com/document/pub?id=19nQzvKP-CVLd7_VrpwnHfl-AE9fjbJySowONZZtNHzw (I didn't write this doc, but kudos to whoever did!)
Add the Google Play Services project into your Eclipse workspace.
Click File -> Import..., select Android -> Existing Android Code into Workspace
Browse to and select /extras/google/google_play_services/libproject/google-play-services_lib
To add the dependency to Google Play Services into your project
Project -> Properties -> Android -> Library, Add -> google-play-services_lib
(Sorry; the markdown won't let me set the numbers to 3 and 4 explicitly.)
Screenshot from OP for posterity: