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
Related
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)
MainActivity.java
Button sendTestSMSButton = (Button)findViewById(R.id.sendTestSMSButton);
sendTestSMSButton.setOnClickListener(new View.OnClickListener()
{
#Override
public void onClick(View v)
{
System.out.println("Send SMS");
try
{
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage("+972526855556", null, "shenkin", null, null);
}
catch (Exception e)
{
e.printStackTrace();
}
}
});
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.smssong.admin.smstosong">
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="22" />
<uses-permission android:name="android.permission.SEND_SMS" />
<application
android:allowBackup="true"
android:icon="#mipmap/ic_launcher"
android:label="#string/app_name"
android:supportsRtl="true"
android:theme="#style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity><!-- ATTENTION: This was auto-generated to add Google Play services to your project for
App Indexing. See https://g.co/AppIndexing/AndroidStudio for more information. -->
<meta-data
android:name="com.google.android.gms.version"
android:value="#integer/google_play_services_version" />
</application>
</manifest>
I get error "Sending SMS message: uid 10063 does not have android.permission.SEND_SMS."
Even that in the AndroidManifest.xml there is code to enable the permission.
What I am missing ?
There was permission error using illegal SDK
I am trying to get the current location of user(tried in genymotion and actual android device) but always getting an error of {"nativeException":{}}. I am testing it with gps enabled and my view model code is below to access the location
var observable = require("data/observable");
var locationModule = require("location");
var LocationManager = new locationModule.LocationManager();
var enums = require('ui/enums');
var MainViewModel = (function (_super) {
__extends(MainViewModel, _super);
function MainViewModel() {
_super.call(this);
}
MainViewModel.prototype.signIn = function () {
//alert("Me");
alert(JSON.stringify(LocationManager));
alert(JSON.stringify(enums.Accuracy));
var locationOptions = {
desiredAccuracy: enums.Accuracy.high,
updateDistance: 0,
minimumUpdateTime: 5000,
maximumAge: 20000
};
LocationManager.startLocationMonitoring(function (location) {
console.log("Location received: " + location);
alert(JSON.stringify(location));
}, function (error) {
alert("Location error received");
alert(JSON.stringify(error));
}, locationOptions);
};
return MainViewModel;
})(observable.Observable);
exports.MainViewModel = MainViewModel;
exports.mainViewModel = new MainViewModel();
This is my AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.nativescript.myapp"
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="22"/>
<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"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<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">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.tns.ErrorReportActivity"/>
</application>
</manifest>
My bet would be that you haven't set the permissions in your AndroidManifest.xml (in NativeScript 1.3.0: platforms/android/src/main).
You want to have a line looking like this:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
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 :)