我写了一个获取天气的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
答案 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);