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