不允许绑定到服务Intent

时间:2012-08-17 13:50:54

标签: android service

我写了一个获取天气的Android服务,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" >
        </service>
    </application>

</manifest>

现在,我想让另一个apk启动此服务:

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

我收到了错误消息:

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 }

我怎样才能解决这个问题?

其他apk使用Messenger方法与气象服务进行通信。

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

全部谢谢!

现在我修改我的气象服务的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>

我使用这种方法开始:

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

然后我收到了警告信息:

W/ActivityManager(131): Unable to start service Intent { act=com.my.weather.WeatherService }: not found

6 个答案:

答案 0 :(得分:8)

我遇到了同样的问题。对我来说问题是我首先使用API​​安装了应用程序,然后是提供API的应用程序。卸载/重新安装第一个应用程序解决了这个问题。

更新:要避免此问题,两个应用都应在其清单中定义权限。

答案 1 :(得分:7)

hara here来自文档:
如果我们想让这个服务在远程进程中运行(而不是其.apk的标准服务),我们可以在其manifest标签中使用android:process指定一个:

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

另请注意,此处选择的名称remote是任意的,如果您需要其他进程,则可以使用其他名称。 :前缀将名称附加到包的标准进程名称。完成后,客户端现在可以绑定到服务并向其发送消息。请注意,这允许客户端向其注册以接收消息。

<强> EDIT1
其次,如果元素(在清单中)包含一个操作字符串,请使用它。例如,如果您的服务声明如下:

<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>         

所以在onCreate()服务方法中执行此操作:

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

我在这个问题中看到了这一点:
Unable to start Service Intent

<强> EDIT2
我再次看到了您的清单。您的清单似乎没有Main/Launcher Activity。在android 3.1 and later中,它会导致无法提供服务。 In fact for security reason all services,receivers,... that you declare in manifest,will not register unless your App run explicitly by user ,这需要一个Main / Launcher Activity.So你必须将这样的Activity添加到你的应用程序中,并注意它已经被执行。

答案 2 :(得分:2)

向WeatherService添加带有操作的intent-filter:

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

然后,当您在其他应用程序中使用bindService()进行绑定时,请使用此意图:

new Intent("this.is.my.custom.ACTION")

答案 3 :(得分:0)

在ur活动类中,执行...假设BothButton是Activity类名,而CleverTexting是Service类名,并且您想从服务调用活动而不是从活动调用服务。如果你的代码在超过4.0的android版本中工作得很好,你可以这样做,那就不会有任何问题了。

CleverTexting mService ; 

public void setService(CleverTexting listener) {
    // TODO Auto-generated method stub
     mService = listener;
}

并在您的服务类中执行...您想要调用您的活动

BothButton mBothButton;

mBothButton = new BothButton(this);
    mBothButton.setService(this);

答案 4 :(得分:0)

当调用bindService进行远程服务时,也应该设置packageName。

Intent intent = new Intent("com.my.weather.WeatherService");
intent.setPackage("com.my.weather");
bindService(intent, serConn, Context.BIND_AUTO_CREATE);

答案 5 :(得分:0)

我的问题在David Wasser的评论中得到了解决,所以我以为我同意。

在清单中,您可以将输出属性设置为true。这使得该服务可供其他应用访问。

Manifest.xml

<service android:name=".MyUsefulService_"
                android:exported="true"/>

MyActivity.java

Intent intent = new Intent();
intent.setComponent(new ComponentName("jav.android.app",jav.android.app.MyUsefulService_");

bindService(this,MyServiceConnection,0);