Unable to Register Android App with GCM : Not allowed to start service Intent -
building app using android studio. there issue in app configuration throws java.lang.securityexception.
the project stored in https://github.com/snambi/gcm_register
the androidmanifest.xml
<application android:allowbackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <uses-sdk android:minsdkversion="14" android:targetsdkversion="19" /> <uses-permission android:name="android.permission.get_accounts"/> <uses-permission android:name="android.permission.internet"/> <uses-permission android:name="android.permission.use_credentials"/> <uses-permission android:name="com.google.android.c2dm.permission.receive"/> <permission android:name="org.antennae.gcmtests.gcmtest.permission.c2d_message" android:protectionlevel="signature"/> <uses-permission android:name="org.antennae.gcmtests.gcmtest.permission.c2d_message"/> <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> <service android:name=".mygcmintentservice" android:exported="false" ></service> </application> the mainactivity
public class mainactivity extends actionbaractivity { public static final string extra_message = "message"; private static final string property_app_version = "appversion"; private static final int play_services_resolution_request = 9000; context context; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); context = getapplicationcontext(); // gcmwrapper startup gcmwrapper gcmwrapper = new gcmwrapper(context); string registrationid = gcmwrapper.getregid(); toast.maketext(context, "reg_id = "+ registrationid, toast.length_short).show(); } } the code registers gcm ( gcmwrapper )
public class gcmwrapper { private context context; public gcmwrapper( context context){ this.context = context; } public string getregid(){ string regid = getregidfromprefs(); if( regid == null || regid.trim().equals("") ){ registerwithgcm(); } return regid; } public string getregidfromprefs(){ string registrationid=null; sharedpreferences preferences = context.getsharedpreferences(constants.pref_antennae, context.mode_private); registrationid = preferences.getstring(constants.pref_registration_id, ""); int appversion = appversionutils.getappversion(context); sharedpreferences prefs =preferencesutil.getsharedpreferences(context); if( appversion != appversionutils.getsavedappversion( prefs ) ){ // if different, clear saved regid registrationid=null; } return registrationid; } public void registerwithgcm(){ gcmregistrationtask registertask = new gcmregistrationtask(context, constants.project_id); registertask.execute(); } public static class gcmregistrationtask extends asynctask{ private context context; private string projectid; public gcmregistrationtask( context context, string projectid ){ this.context = context; this.projectid = projectid; } @override protected object doinbackground(object[] params) { string regid = null; googlecloudmessaging gcm = googlecloudmessaging.getinstance(context); try { regid = gcm.register( projectid ); } catch (ioexception e) { e.printstacktrace(); } return regid; } } } exception thrown
06-18 22:54:01.737 24266-24317/org.antennae.gcmtests.gcmtest e/androidruntime﹕ fatal exception: asynctask #1 java.lang.runtimeexception: error occured while executing doinbackground() @ android.os.asynctask$3.done(asynctask.java:299) @ java.util.concurrent.futuretask.finishcompletion(futuretask.java:352) @ java.util.concurrent.futuretask.setexception(futuretask.java:219) @ java.util.concurrent.futuretask.run(futuretask.java:239) @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1080) @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:573) @ java.lang.thread.run(thread.java:841) caused by: java.lang.securityexception: not allowed start service intent { act=com.google.android.c2dm.intent.register pkg=com.google.android.gms (has extras) } without permission com.google.android.c2dm.permission.receive @ android.app.contextimpl.startserviceasuser(contextimpl.java:1412) @ android.app.contextimpl.startservice(contextimpl.java:1394) @ android.content.contextwrapper.startservice(contextwrapper.java:473) @ com.google.android.gms.gcm.googlecloudmessaging.zzx(unknown source) @ com.google.android.gms.gcm.googlecloudmessaging.register(unknown source) @ org.antennea.gcm.gcmwrapper$gcmregistrationtask.doinbackground(gcmwrapper.java:70) @ android.os.asynctask$2.call(asynctask.java:287) @ java.util.concurrent.futuretask.run(futuretask.java:234) @ java.util.concurrent.threadpoolexecutor.runworker(threadpoolexecutor.java:1080) @ java.util.concurrent.threadpoolexecutor$worker.run(threadpoolexecutor.java:573) @ java.lang.thread.run(thread.java:841)
it looks issue other people (see here).
i checked official gcm docs , indeed can verify you'll need place uses-permission outside application tag.
by way, looks using deprecated c2dm libraries. might want use latest one avoid hassle of migrating later on. there sample project provided in docs well.
Comments
Post a Comment