I am unable to deploy my app (in debug/release) on Android 6 (API 23) but on Android 8 (API 26) and Android 9 (API 28) everything works fine. There is a INSTALL_PARSE_FAILED_MANIFEST_MALFORMED error in output.
Output:
Detecting installed packages...
Copying application to device...
90% ... 21184kb of 23527kb copied
100% ... 23527kb of 23527kb copied
ADB0000: Deployment failed Mono.AndroidTools.InstallFailedException:
Unexpected install output: pkg:
/data/local/tmp/com.companyname.appname-Signed.apk Failure
[INSTALL_PARSE_FAILED_MANIFEST_MALFORMED]
at Mono.AndroidTools.Internal.AdbOutputParsing.CheckInstallSuccess(String output, String packageName) in E:\A_work\275\s\External\androidtools\Mono.AndroidTools\Internal\AdbOutputParsing.cs:line 345
at Mono.AndroidTools.AndroidDevice.<>c__DisplayClass95_0.b__0(Task1 t) in E:\A\_work\275\s\External\androidtools\Mono.AndroidTools\AndroidDevice.cs:line 753
at System.Threading.Tasks.ContinuationTaskFromResultTask1.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
ADB0010: Unexpected install output: pkg:
/data/local/tmp/com.companyname.appname-Signed.apk Failure
[INSTALL_PARSE_FAILED_MANIFEST_MALFORMED]
at
Mono.AndroidTools.Internal.AdbOutputParsing.CheckInstallSuccess(String
output, String packageName) in
E:\A_work\275\s\External\androidtools\Mono.AndroidTools\Internal\AdbOutputParsing.cs:line
345 at
Mono.AndroidTools.AndroidDevice.<>c__DisplayClass95_0.b__0(Task1
t) in
E:\A\_work\275\s\External\androidtools\Mono.AndroidTools\AndroidDevice.cs:line
753 at
System.Threading.Tasks.ContinuationTaskFromResultTask1.InnerInvoke()
at System.Threading.Tasks.Task.Execute() Done building project
"AppNameInCamelCase.Droid.csproj" -- FAILED.
Blockquote
Build FAILED.
2>Deployment failed to Samsung SM-G800F.
========== Build: 1 succeeded, 0 failed, 6 up-to-date, 0 skipped ==========
========== Deploy: 0 succeeded, 1 failed, 0 skipped ==========
Here is my AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" package="com.companynameallinsmall.appnameallinsmall" android:versionName="X.X.x" android:versionCode="XXXYYY">
<!--Target SDK version should be 25+ in order to ask for permissions in popups.-->
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<!--Permissions which are requested via popup.-->
<!--For logging and data writing.-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--For picking photo.-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--For location-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--Permissions granted during installation.-->
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-feature android:name="android.hardware.sensor.compass" android:required="false" />
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
<uses-feature android:name="android.hardware.location" android:required="true" />
<uses-feature android:name="android.hardware.location.gps" android:required="true" />
<uses-feature android:name="android.hardware.location.network" android:required="true" />
<application android:label="CamelCase Name" android:theme="#style/STAPPCustomTheme">
<uses-library android:name="org.apache.http.legacy" android:required="false" />
<meta-data android:name="com.google.android.geo.API_KEY" android:value="YXSIBIDGA......" />
</application>
</manifest>
Compiled AndroidManifest - Obj Folder
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" package="com.companynameallinsmall.appnameallinsmall" android:versionName="X.X.x" android:versionCode="XXXYYY">
<!--Target SDK version should be 25+ in order to ask for permissions in popups.-->
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="28" />
<!--Permissions which are requested via popup.-->
<!--For logging and sensor data writing.-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!--For picking photo.-->
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<!--For location-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!--Permissions granted during installation.-->
<uses-permission android:name="com.android.vending.BILLING" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.BATTERY_STATS" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-feature android:name="android.hardware.sensor.compass" android:required="false" />
<uses-feature android:name="android.hardware.sensor.accelerometer" android:required="true" />
<uses-feature android:name="android.hardware.location" android:required="true" />
<uses-feature android:name="android.hardware.location.gps" android:required="true" />
<uses-feature android:name="android.hardware.location.network" android:required="true" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<application android:label="CamelCase Name" android:theme="#style/STAPPCustomTheme" android:name="android.app.Application" android:allowBackup="true" android:icon="#mipmap/icon" android:debuggable="true">
<uses-library android:name="org.apache.http.legacy" android:required="false" />
<meta-data android:name="com.google.android.geo.API_KEY" android:value="YXSIBIDGA......" />
<activity android:configChanges="orientation|screenSize" android:icon="#mipmap/icon" android:label="CamelCase Name" android:launchMode="singleTop" android:screenOrientation="portrait" android:name="md***********.MainActivity" />
<activity android:configChanges="orientation|screenSize" android:icon="#mipmap/icon" android:label="CamelCase Name" android:noHistory="true" android:screenOrientation="portrait" android:theme="#style/Theme.SplashNotPowered" android:name="md***********.SplashScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider android:authorities="com.companynameallinsmall.appnameallinsmall.fileProvider" android:exported="false" android:grantUriPermissions="true" android:name="Companyname.Utils.fileProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="#xml/companynameallinsmall_utils_fileprovider_file_paths" />
</provider>
<service android:name="md***********.MatchaBackgroundService" />
<receiver android:enabled="true" android:exported="false" android:label="Connectivity Plugin Broadcast Receiver" android:name="md***********.ConnectivityChangeBroadcastReceiver" />
<activity android:configChanges="orientation|screenSize" android:name="md***********.MediaPickerActivity" />
<receiver android:enabled="true" android:exported="false" android:label="Essentials Battery Broadcast Receiver" android:name="md***********.BatteryBroadcastReceiver" />
<provider android:authorities="com.companynameallinsmall.appnameallinsmall.fileProvider" android:exported="false" android:grantUriPermissions="true" android:name="xamarin.essentials.fileProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="#xml/xamarin_essentials_fileprovider_file_paths" />
</provider>
<receiver android:enabled="true" android:exported="false" android:name="md***********.PowerSaveModeBroadcastReceiver" />
<provider android:name="mono.MonoRuntimeProvider" android:exported="false" android:initOrder="1999999999" android:authorities="com.companynameallinsmall.appnameallinsmall.mono.MonoRuntimeProvider.__mono_init__" />
<!--suppress ExportedReceiver-->
<receiver android:name="mono.android.Seppuku">
<intent-filter>
<action android:name="mono.android.intent.action.SEPPUKU" />
<category android:name="mono.android.intent.category.SEPPUKU.com.companynameallinsmall.appnameallinsmall" />
</intent-filter>
</receiver>
<activity android:name="com.google.android.gms.common.api.GoogleApiActivity" android:theme="#android:style/Theme.Translucent.NoTitleBar" android:exported="false" />
<meta-data android:name="com.google.android.gms.version" android:value="#integer/google_play_services_version" />
</application>
</manifest>
Lint output AndroidManifest.xml:
Scanning manifest:
manifest: Error: Can't find API database; API check not performed [LintError]
AndroidManifest.xml:43: Warning: Use '$' instead of '.' for inner
classes (or use only lowercase letters in package names); replace
"Companyname.Utils.fileProvider" with "Companyname$Utils$fileProvider"
[InnerclassSeparator]
<provider android:authorities="com.companynameallinsmall.fileProvider"
android:exported="false" android:grantUriPermissions="true" android:name="Companyname.Utils.fileProvider">
AndroidManifest.xml:33: Error: Avoid hardcoding the debug mode; leaving it out allows debug
and release builds to automatically assign one [HardcodedDebugMode]
<application android:label="CamelCase Name" android:theme="#style/STAPPCustomTheme" android:name="android.app.Application" android:allowBackup="true" android:icon="#mipmap/icon" android:debuggable="true">
AndroidManifest.xml:33: Warning: On SDK
version 23 and up, your app data will be automatically backed up and
restored on app install. Consider adding the attribute
android:fullBackupContent to specify an #xml resource which configures
which files to backup. More info:
https://developer.android.com/training/backup/autosyncapi.html
[AllowBackup]
<application android:label="CamelCase Name" android:theme="#style/STAPPCustomTheme"
android:name="android.app.Application" android:allowBackup="true"
android:icon="#mipmap/icon" android:debuggable="true">
AndroidManifest.xml:33: Warning: App is not indexable by Google
Search; consider adding at least one Activity with an ACTION-VIEW
intent filter. See issue explanation for more details.
[GoogleAppIndexingWarning]
<application android:label="CamelCase Name" android:theme="#style/STAPPCustomTheme" android:name="android.app.Application" android:allowBackup="true" android:icon="#mipmap/icon" android:debuggable="true">
^ 2 errors, 3
warnings
My Installed Android SDKs
1.To resolve the first error:
manifest: Error: Can't find API database; API check not performed
[LintError]
You can try to set the Linking option to None
2.To resolve the second error:
AndroidManifest.xml:33: Error: Avoid hardcoding the debug mode;
leaving it out allows debug and release builds to automatically assign
one [HardcodedDebugMode]
You can try to disable Debugging in your code:
For more details, you can check:
https://learn.microsoft.com/en-us/xamarin/android/deploy-test/release-prep/?tabs=windows#disable-debugging
https://learn.microsoft.com/en-us/xamarin/android/deploy-test/debuggable-attribute
Note:
If your app still has problems,could you please post a basic demo so that we can test on my side?
Related
I have used Xamarin.Forms.GoogleMaps in my app for google map. But it always shows Xamarin.Forms.GoogleMaps message instead of loading google map as shown in below image.
In Android: Manifest file i added all permissions and key. I initiated in main activity file.
I am getting this Message instead of loading map
Am I missing something?
Android manifest file:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.eShop.Mobile" android:installLocation="auto">
<uses-sdk android:minSdkVersion="22" android:targetSdkVersion="28" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_CHECKIN_PROPERTIES" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<application android:label="eShop.Mobile.Android">
<meta-data android:name="com.google.android.geo.API_KEY" android:value="*********" />
<meta-data android:name="com.google.android.gms.version" android:value="#integer/google_play_services_version" />
</application>
</manifest>
View.Xaml
<ContentPage.Content>
<StackLayout>
<!-- Place new controls here -->
<maps:Map VerticalOptions="FillAndExpand">
</maps:Map>
<!--<Label Text="check"></Label>-->
</StackLayout>
</ContentPage.Content>
MAinActivity.cs
protected override void OnCreate(Bundle savedInstanceState)
{
TryToLocationGetPermissions();
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.FormsGoogleMaps.Init(this, savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
In my nativescript appllication, I use nativescript-local-notifications NPM to push the local notification and I have followed the instructions same as the readme file in the github.
I face the error
LocalNotifications.schedule: TypeError: builder.setChannelId is not a function
I referred the GitHub issue which is already resolved by someone. But still, I face the issue.
ItemComponent.ts:
import * as LocalNotifications from "nativescript-local-notifications";
scheduleTesting() {
console.log("I am inside schedule noti");
LocalNotifications.hasPermission().then(
function (granted) {
console.log("Permission granted -->" + granted);
}
)
LocalNotifications.schedule([{
id: 0,
title: 'Sound & Badge',
body: 'Who needs a push service anyway?',
badge: 1,
at: new Date(new Date().getTime() + (5 * 1000)) // 5 seconds from now
}])
LocalNotifications.addOnMessageReceivedCallback(data => {
alert({
title: "Local Notification received",
message: `id: '${data.id}', title: '${data.title}'.`,
okButtonText: "Roger that"
});
});
}
manifestoXML
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="__PACKAGE__"
android:versionCode="1"
android:versionName="1.0">
<supports-screens
android:smallScreens="true"
android:normalScreens="true"
android:largeScreens="true"
android:xlargeScreens="true"/>
<uses-sdk
android:minSdkVersion="17"
android:targetSdkVersion="__APILEVEL__"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:name="com.tns.NativeScriptApplication"
android:allowBackup="true"
android:icon="#drawable/icon"
android:label="#string/app_name"
android:theme="#style/AppTheme">
<activity
android:name="com.tns.NativeScriptActivity"
android:label="#string/title_activity_kimera"
android:configChanges="keyboardHidden|orientation|screenSize"
android:theme="#style/LaunchScreenTheme"
android:launchMode="singleTop"
>
<meta-data android:name="SET_THEME_ON_LAUNCH" android:resource="#style/AppTheme" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data android:name="android.app.shortcuts"
android:resource="#xml/shortcuts" />
</activity>
<activity
android:name="com.tns.ErrorReportActivity"/>
</application>
</manifest>
API level = 27
"nativescript-local-notifications": "^2.0.3",
GITHub issue url : https://github.com/EddyVerbruggen/nativescript-local-notifications/pull/68
I have created an app that calls boot completed class every time the phone restart. But my issue
is that I get a message that says 'Unfortunately, the app has stopped' every time I restart the phone, especially on older phones like OS 4.4.2. What could cause this issue?
My code :
Manifes.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="mypackagename" android:versionCode="1" android:versionName="1.0" android:installLocation="preferExternal">
<uses-sdk android:minSdkVersion="15" android:targetSdkVersion="23" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application android:allowBackup="true" android:label="#string/app_name" android:icon="#drawable/shortcut_icon">
<service android:enabled="true" android:name=".AppService" />
<receiver android:name=".RebootListener" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
</application>
</manifest>
Boot completed class
[BroadcastReceiver(Enabled = true)]
[IntentFilter(new[] { Android.Content.Intent.ActionBootCompleted })]
public class RebootListener : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
Intent serviceIntent = new Intent(context, typeof(AppService));
context.StartService(serviceIntent);
}
}
The issue persists even if I comment out the code in the OnReceive method. I presume the problem might be in the manifest file. If I remove the boot completed code in the manifest file I stop receiving this error message.
Remove the receiver from your manifest:
<receiver android:name=".RebootListener" android:enabled="true" android:exported="true">
<intent-filter>
~~~~
</intent-filter>
You have applied the BroadcastReceiver attribute to your BroadcastReceiver subclass and thus the Xamarin.Android build process will create this in your manifest automatically using a MD5-based Java class name (which will not be just .RebootListener)
I've got a big problem with my first app. I've uploaded the app earlier this day to the Google Play Store and there it says that my app supports zero devices. What am I doing wrong? Here is my AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:smallScreens="false"
android:resizeable="true" />
<uses-feature
android:name="android.service.wallpaper"
android:required="true">
</uses-feature>
<application
android:allowBackup="true"
android:icon="#drawable/icon"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
<activity
android:name="app.wallpaper.com.giflivewallpaper.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>
<service
android:name="app.wallpaper.com.giflivewallpaper.GIFWallpaperService"
android:enabled="true"
android:label="Particle Live Wallpaper"
android:permission="android.permission.BIND_WALLPAPER" >
<intent-filter>
<action android:name="android.service.wallpaper.WallpaperService" />
</intent-filter>
<meta-data
android:name="android.service.wallpaper"
android:resource="#xml/wallpaper" >
</meta-data>
</service>
</application>
In your uses-feature, did you mean android.software.live_wallpaper?
<uses-feature
android:name="android.software.live_wallpaper"
android:required="true">
</uses-feature>
http://developer.android.com/guide/topics/manifest/uses-feature-element.html
I am struggling of using Parse on my Unity android application. Have been working on several days but no success yet. No matter how hard I try, I couldn't get my device token registered for Android which is needed for sending push notifications to android. Below is my sample code and manifest snippet..
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:protectionLevel="signature" android:name="com.JoyDash.Movies.permission.C2D_MESSAGE" />
<uses-permission android:name="com.JoyDash.Movies.permission.C2D_MESSAGE" />
<!--Parse Push notification receiver-->
<service android:name="com.parse.PushService" />
<receiver android:name="com.parse.ParseBroadcastReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
<action android:name="android.intent.action.USER_PRESENT" />
</intent-filter>
</receiver>
<receiver android:name="com.JoyDash.Movies.Receiver" android:exported="false">
<intent-filter>
<action android:name="com.parse.push.intent.RECEIVE" />
<action android:name="com.parse.push.intent.DELETE" />
<action android:name="com.parse.push.intent.OPEN" />
</intent-filter>
</receiver>
<receiver android:name="com.parse.GcmBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.JoyDash.Movies" />
</intent-filter>
</receiver>
<!--<receiver android:name="com.parse.ParsePushBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<category android:name="com.JoyDash.Movies" />
</intent-filter>
</receiver>
<service android:name="com.parse.ParsePushService" />-->
#if UNITY_IOS
NotificationServices.RegisterForRemoteNotificationTypes (RemoteNotificationType.Alert |
RemoteNotificationType.Badge |
RemoteNotificationType.Sound);
#endif
//ParsePush.SubscribeAsync
Debug.Log("Registration with Parse Push. : " + Application.platform);
ParsePush.ParsePushNotificationReceived += (sender, args) =>
{
if (Application.platform == RuntimePlatform.Android)
{
AndroidJavaClass parseUnityHelper = new AndroidJavaClass("com.parse.ParseUnityHelper");
AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
// Call default behavior.
Debug.Log("Calling Parse from Unity and Payload is : " + args.Payload);
parseUnityHelper.CallStatic("handleParsePushNotificationReceived", currentActivity, args.Payload.ToString());
//parseUnityHelper.CallStatic("handleParsePushNotificationReceived", currentActivity, args.Payload.StringPayload);
}
else if (Application.platform == RuntimePlatform.IPhonePlayer)
{
//IDictionary<string, object> payload = args.Payload;
//foreach (string key in payload)
//{
// Debug.Log("Payload: " + key + ": " + payload[key].ToString());
//}
}
};
//Parse Installation
Debug.Log("Device Token : " + ParseInstallation.CurrentInstallation.DeviceToken);
if (ParseInstallation.CurrentInstallation != null && !string.IsNullOrEmpty(ParseInstallation.CurrentInstallation.DeviceToken))
{
Debug.Log("Device Token : " + ParseInstallation.CurrentInstallation.DeviceToken);
}
else
{
//Create a new parse installation
//ParseInstallation.CurrentInstallation.SaveAsync().ContinueWith(t =>
// {
// if (t.IsFaulted || t.IsCanceled)
// {
// Debug.Log("Parse installation failed to save.");
// }
// else
// {
// Debug.Log("Parse installation saved successfully.");
// }
// });
//ParseInstallation.cre
Debug.Log("There is no installation data received for this device.. Now subscribing to a channel");
ParsePush.SubscribeAsync("Channel01").ContinueWith(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
Debug.Log("Subscription of push notification failed.");
}
else
{
Debug.Log("Push notification subscribed successfully.");
}
});
//installation.
}
"Parse Unity Push Sample not working", agree!! boy, such a pain in the ( Y )
I've been fighting with Unity Parse Pushes for days(a week?) and I just solve it. I am so, so, happy, I want to share my happiness (first time in my life I write at StackOverflow, guess it was about time...)
Not sure if this will solve your problem, but for sure you have something wrong at this line:
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity");
We have to change "currentActivity" for what ever is your current activity. In my case I have written this:
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject> ("com.unity3d.player.UnityPlayerNativeActivity");
Because that's the name of my activity in my AndroidManifest.xml
<activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="#string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:launchMode="singleTask" android:screenOrientation="landscape">
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Still, it might not solve your problem. So, just in case, I copy paste my code!
AndroidManifest.xml:
<?xml version="1.0" encoding="UTF-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="preferExternal" package="com.XXXX.YYYY" android:versionName="1" android:versionCode="7">
<supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
<uses-feature android:glEsVersion="0x00020000" />
<uses-sdk android:minSdkVersion="9" android:targetSdkVersion="18" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
<permission android:protectionLevel="signature" android:name="com.XXXX.YYYY.permission.C2D_MESSAGE" />
<uses-permission android:name="com.XXXX.YYYY.permission.C2D_MESSAGE" />
<uses-permission android:name="com.android.vending.CHECK_LICENSE" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:icon="#drawable/app_icon" android:label="#string/app_name" android:debuggable="false">
<service android:name="com.parse.ParsePushService" />
<receiver android:name="com.parse.ParsePushBroadcastReceiver" android:permission="com.google.android.c2dm.permission.SEND">
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<action android:name="com.google.android.c2dm.intent.REGISTRATION" />
<action android:name="com.parse.push.intent.DELETE" />
<action android:name="com.parse.push.intent.OPEN" />
<category android:name="com.XXXX.YYYY" />
</intent-filter>
</receiver>
<activity android:name="com.unity3d.player.UnityPlayerNativeActivity" android:label="#string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" android:launchMode="singleTask" android:screenOrientation="landscape">
<meta-data android:name="unityplayer.ForwardNativeEventsToDalvik" android:value="true" />
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.unity3d.player.UnityPlayerActivity" android:label="#string/app_name" android:configChanges="fontScale|keyboard|keyboardHidden|locale|mnc|mcc|navigation|orientation|screenLayout|screenSize|smallestScreenSize|uiMode|touchscreen" />
<!-- replace #drawable/push_icon with your push icon identifier -->
<meta-data android:name="com.parse.push.notification_icon" android:resource="#drawable/app_icon"/>
</application>
</manifest>
Please, replace com.XXXX.YYYY by -your- bundle identifier, in case of thetnswe would be by com.JoyDash.Movies
(funny thing: there is no GCM BroadcastReceiver as the Parse Push samples says, it was spitting errors like this error setting up push notification using parse.com and android studio)
And then I have a C# Unity Script in one of my GameObjects (actually the same than the one I use to initialize Parse):
using UnityEngine;
using System.Collections;
using Parse;
public class ParsePushRegistration : MonoBehaviour {
// Use this for initialization
void Start () {
#if UNITY_ANDROID
ParsePush.ParsePushNotificationReceived += (sender, args) => {
AndroidJavaClass parseUnityHelper = new AndroidJavaClass ("com.parse.ParseUnityHelper");
AndroidJavaClass unityPlayer = new AndroidJavaClass ("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject> ("com.unity3d.player.UnityPlayerNativeActivity");
// Call default behavior.
parseUnityHelper.CallStatic ("handleParsePushNotificationReceived", currentActivity, args.StringPayload);
};
#endif
}
}
Hope it helps! If not, let me know... and we will see :)