我正试图将我的android应用程序连接到MS Band,但我收到了以下错误:
java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.microsoft.band.service.action.BIND_BAND_SERVICE }
我使用的代码片段如下:
private View.OnClickListener mButtonConnectClickListener = new View.OnClickListener() {
@Override
public void onClick(View button) {
pairedBands = BandClientManager.getInstance().getPairedBands();
bandClient = BandClientManager.getInstance().create(getApplicationContext(), pairedBands[0]);
// Connect must be called on a background thread.
new ConnectTask().execute();
}
};
private class ConnectTask extends AsyncTask<BandClient, Void, Void> {
@Override
protected Void doInBackground(BandClient... clientParams) {
BandPendingResult<ConnectionResult> pendingResult = null;
try {
pendingResult = bandClient.connect();
} catch (BandIOException e) {
e.printStackTrace();
}
try {
ConnectionResult result = pendingResult.await();
if(result == ConnectionResult.OK) {
BandConnection.setText("Connection Worked");
} else {
BandConnection.setText("Connection Failed");
}
} catch(InterruptedException ex) {
// handle InterruptedException
} catch(BandException ex) {
// handle BandException
}
return null;
}
protected void onPostExecute(Void result) {
}
}
我正在遵循Microsft Band SDK中给出的示例,我对此是新手。如有任何帮助,我们将不胜感激。
尽管@tyczj的评论是绝对正确的,但它缺少一个变通方法。我将尝试在这个答案中描述这个问题、它的起源和(临时)解决方法。
让我们先找出问题。在Band SDK内部的某个地方,正在进行这样的调用:
Intent service = new Intent("com.microsoft.band.service.action.BIND_BAND_SERVICE");
context.bindService(service, connections, flags);
创建了一个隐式意图,用于绑定到服务。不幸的是,启动Android5.0时,不再允许绑定到服务使用隐式意图(如API更改中所述)。相反,意图应该是明确的。
由于以上情况发生在混淆的band SDK内部,并且我们没有它的来源,因此"更新"代码以使用明确的意图并非易事。如果你足够精明,你可能会改变Java字节码来做到这一点,但我想提出一个不同的解决方法:
由于异常是由bindService()
引发的,并且intent是其参数之一,因此我们可以重写该方法,以确保提供的任何intent最终都是显式的。
例如:下面的代码确保任何以com.microsoft.band
(包括但不限于com.microsoft.band.service.action.BIND_BAND_SERVICE
)开头的动作的意图都可以通过设置包名称来明确。
ContextWrapper bandContextWrapper = new ContextWrapper(getApplicationContext()) {
@Override public boolean bindService(Intent service, ServiceConnection conn, int flags) {
final String action = service.getAction();
if (!TextUtils.isEmpty(action) && action.startsWith("com.microsoft.band")) {
service.setPackage("com.microsoft.band");
}
return super.bindService(service, conn, flags);
}
};
现在,您可以使用这个包装来拦截有问题的调用,并通过将其作为启动服务的"上下文"传递给BandClientManager
来更新意图(如果需要)
bandClient = BandClientManager.getInstance().create(bandContextWrapper, pairedBands[0]);
现在您不应该再获得IllegalArgumentException
。我自己没有微软乐队,所以不能保证在这之后一切都会完全正常,但它至少应该解决你问题中列出的问题。
请注意,这只应被视为临时解决方法。正如其中一条评论所指出的,微软真的应该更新其SDK以符合Android 5+。这是唯一正确的解决方案。在那之前,希望这能有所帮助。
如果有人在使用Xamarin.Android:
private class BandContextWrapper : ContextWrapper
{
public BandContextWrapper(Context baseContext)
: base (baseContext)
{
}
public override bool BindService(Intent service, IServiceConnection conn, Bind flags)
{
var action = service.Action;
if (!string.IsNullOrEmpty(action) && action.StartsWith("com.microsoft.band"))
{
service.SetPackage("com.microsoft.kapp");
}
return base.BindService(service, conn, flags);
}
}
然后使用它:
var bandContextWrapper = new BandContextWrapper(Application.Context);
var client = BandClientManager.Instance.Create(bandContextWrapper, info);
我在这里使用http://components.xamarin.com/view/microsoft-band-sdk