Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Not allowed to bind to service Intent

I write an android service of get weather, and the AndroidManifest.xml is:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.weather"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service
            android:name=".WeatherService"
            android:exported="true" >
        </service>
    </application>

</manifest>

Now, I want let another apk to start this service:

Intent service = new Intent();
service.setClassName("com.my.weather", "com.my.weather.WeatherService");
context.bindService(service, weatherServiceConnection, Context.BIND_AUTO_CREATE);

And I got the error message:

E/AndroidRuntime(14068): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.my.test/com.my.test.MainActivity}: java.lang.SecurityException: Not allowed to bind to service Intent { cmp=com.my.weather/.WeatherService }

How can I solved this issue?

Other apk is use the Messenger method to communication with weather service.

================================================================================

Thanks all!

Now I modify my weather service's AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.my.weather"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="15" />

    <uses-permission android:name="android.permission.INTERNET" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <service
            android:name=".WeatherService"
            android:exported="true"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.my.weather.WeatherService"></action>
            </intent-filter>
        </service>
    </application>

</manifest>

And I use this method to start:

Intent service = new Intent("com.my.weather.WeatherService");
context.bindService(service, weatherServiceConnection, Context.BIND_AUTO_CREATE);

Then I got the warning message:

W/ActivityManager(131): Unable to start service Intent { act=com.my.weather.WeatherService }: not found
like image 255
Tony Avatar asked Aug 17 '12 13:08

Tony


3 Answers

I had the same problem. For me the problem was that I first installed the app using the API and then app that provided the API. Uninstalling/Reinstalling the first app solved the problem.

Update: To avoid the problem both apps should define the permission in their manifest.

like image 58
plaisthos Avatar answered Oct 23 '22 09:10

plaisthos


Here says from documentation:

If we want to make this service run in a remote process (instead of the standard one for its .apk), we can use android:process in its manifest tag to specify one:

<service android:name=".app.MessengerService"
        android:process=":remote" />

Also note that the name remote chosen here is arbitrary, and you can use other names if you want additional processes. The : prefix appends the name to your package's standard process name. With that done, clients can now bind to the service and send messages to it. Note that this allows clients to register with it to receive messages back as well.

Edit1:
Second, if the service element (in manifest) contains an action string, use it. For example if your service declared like this:

<service android:name="com.sample.service.serviceClass"  
            android:exported="true" android:label="@string/app_name" 
            android:process=":remote">
   <intent-filter><action android:name="com.sample.service.serviceClass"></action>
   </intent-filter>
</service>         

So do this in onCreate() method of your service:

public void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);  
      Intent intent=new Intent("com.sample.service.serviceClass");  
      this.startService(intent);
}

I saw that in this question:
Unable to start Service Intent

Edit2:
I saw your manifest again.It seems that your manifest has no Main/Launcher Activity.In android 3.1 and later it causes no service be available.In fact forsecurityreason all services,receivers,... that you declare in manifest,will not register unless your App run explicitly by user and this needs to a Main/Launcher Activity.So you have to add such Activity to your App and be care that it has already been performed.

like image 7
hasanghaforian Avatar answered Oct 23 '22 11:10

hasanghaforian


Add an intent-filter with an action to your WeatherService:

<service
    android:name=".WeatherService"
    android:exported="true" >
    <intent-filter>
        <action android:name="this.is.my.custom.ACTION" />
    </intent-filter>
</service>

Then, when you go to bind with bindService() in your other app, use this intent:

new Intent("this.is.my.custom.ACTION")
like image 2
CompEng88 Avatar answered Oct 23 '22 11:10

CompEng88