Android L Dev Previewにアップグレードするまで、アプリ内課金コードは正常に機能していました。今ではアプリの起動時にこのエラーが表示されます。これを修正するためにコードを変更する必要がありますか?
Android {
compileSdkVersion 'Android-L'
buildToolsVersion '20'
defaultConfig {
minSdkVersion 13
targetSdkVersion 'L'
...
...
compile 'com.google.Android.gms:play-services:5.+'
compile 'com.Android.support:support-v13:21.+'
compile 'com.Android.support:appcompat-v7:21.+'
...
...
アプリの起動時のエラー:
06-29 16:22:33.281 5719-5719/com.tbse.wnswfree D/AndroidRuntime﹕ Shutting down VM
06-29 16:22:33.284 5719-5719/com.tbse.wnswfree E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.tbse.wnswfree, PID: 5719
Java.lang.RuntimeException: Unable to start activity ComponentInfo{com.tbse.wnswfree/com.tbse.wnswfree.InfoPanel}: Java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.Android.vending.billing.InAppBillingService.BIND }
at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2255)
at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2317)
at Android.app.ActivityThread.access$800(ActivityThread.Java:143)
at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1258)
at Android.os.Handler.dispatchMessage(Handler.Java:102)
at Android.os.Looper.loop(Looper.Java:135)
at Android.app.ActivityThread.main(ActivityThread.Java:5070)
at Java.lang.reflect.Method.invoke(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:372)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:836)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:631)
Caused by: Java.lang.IllegalArgumentException: Service Intent must be explicit: Intent { act=com.Android.vending.billing.InAppBillingService.BIND }
at Android.app.ContextImpl.validateServiceIntent(ContextImpl.Java:1603)
at Android.app.ContextImpl.bindServiceCommon(ContextImpl.Java:1702)
at Android.app.ContextImpl.bindService(ContextImpl.Java:1680)
at Android.content.ContextWrapper.bindService(ContextWrapper.Java:528)
at com.tbse.wnswfree.util.IabHelper.startSetup(IabHelper.Java:262)
at com.tbse.wnswfree.InfoPanel.onStart(InfoPanel.Java:709)
at Android.app.Instrumentation.callActivityOnStart(Instrumentation.Java:1217)
at Android.app.Activity.performStart( Activity.Java:5736)
at Android.app.ActivityThread.performLaunchActivity( ActivityThread.Java:2218)
at Android.app.ActivityThread.handleLaunchActivity( ActivityThread.Java:2317)
at Android.app.ActivityThread.access$800( ActivityThread.Java:143)
at Android.app.ActivityThread$H.handleMessage( ActivityThread.Java:1258)
...
InfoPanel.Javaの709行目:
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
...
同じ問題があり、明示的にパッケージを設定すると解決しました。アレクセイの答えに似ていますが、より簡単です:
Intent intent = new Intent("com.Android.vending.billing.InAppBillingService.BIND");
// This is the key line that fixed everything for me
intent.setPackage("com.Android.vending");
getContext().bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
以下の回答で指摘したように、解決策は明示的な意図を手動で作成することです。
private Intent getExplicitIapIntent() {
PackageManager pm = mContext.getPackageManager();
Intent implicitIntent = new Intent("com.Android.vending.billing.InAppBillingService.BIND");
List<ResolveInfo> resolveInfos = pm.queryIntentServices(implicitIntent, 0);
// Is somebody else trying to intercept our IAP call?
if (resolveInfos == null || resolveInfos.size() != 1) {
return null;
}
ResolveInfo serviceInfo = resolveInfos.get(0);
String packageName = serviceInfo.serviceInfo.packageName;
String className = serviceInfo.serviceInfo.name;
ComponentName component = new ComponentName(packageName, className);
Intent iapIntent = new Intent();
iapIntent.setComponent(component);
return iapIntent;
}
ここ は、明示的な意図をチェックするためのLプレビューソースのコードです。 コメント付き が現在ありますが、Lプレビュー付きのNexus 5では、暗黙のインテントに対して引き続き実行され、例外がスローされます。
編集:@alavの answer は、はるかに優れたシンプルなものです。追加するだけ
intent.setPackage("com.Android.vending");
ここで明確な解決策を見つけました: https://code.google.com/p/Android-developer-preview/issues/detail?id=1674
Google Licensing Library(LVL)のLicenseChecker.Javaファイルで、「bindService」呼び出しを次のように置き換えます。
Intent serviceIntent = new Intent(
new String(Base64.decode("Y29tLmFuZHJvaWQudmVuZGluZy5saWNlbnNpbmcuSUxpY2Vuc2luZ1NlcnZpY2U=")));
serviceIntent.setPackage("com.Android.vending");
boolean bindResult = mContext
.bindService(
serviceIntent,
this, // ServiceConnection.
Context.BIND_AUTO_CREATE);
AND AndroidManifest.xmlセット:Android:minSdkVersion = "4"
「setPackage」にはAndroidバージョン4が必要です。
サービスへの「L」バインディングでは、明示的な意図を使用する必要があります。
http://commonsware.com/blog/2014/06/29/dealing-deprecations-bindservice.html を参照してください
コードを置き換えるだけです
boolean attempt = mContext.bindService(new Intent("com.Android.vending.billing.InAppBillingService.BIND"),
mServiceConn, Context.BIND_AUTO_CREATE);
次のコードで
Intent serviceIntent = new Intent("com.Android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.Android.vending");
boolean attempt = mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
クラスでIabHelper
inappbillingのutilsフォルダーに配置しました(Google InApp Billingチュートリアルの指示に従った場合)。
古いGoogle Cloud Messagingセットアップコードから同じエラーが発生していました。最も単純な修正は変更されているようです
Intent registrationIntent = new Intent(
"com.google.Android.c2dm.intent.REGISTER");
に
Intent registrationIntent = new Intent();
registrationIntent.setClassName("com.google.Android.c2dm.intent", "REGISTER");
以下のエラーがある場合は、build.gradleでtargetSdkVersion 19を設定してください。 19に設定すると、問題が解決しました。パブリッシュの場合、targetSdkVersion 27を設定します
com.google.Android.vending.licensing.LicenseChecker.checkAccess(LicenseChecker.Java:150)at com.google.Android.vending.expansion.downloader.impl.DownloaderService $ LVLRunnable.run
defaultConfig {
applicationId "com.brain.math.game.free"
minSdkVersion 15
targetSdkVersion 19
targetSdkVersion 19
私にとっては、サンプルの現在のIabHelperを使用するのに役立ちました:sdk/extras/google/play_billing/samples/TrivialDrive/src/com/example/Android/trivialdrivesample/util/IabHelper.Java
最初にSDK更新マネージャーを実行して、現在のバージョンがインストールされていることを確認することを忘れないでください。
この特定の問題に対する回答は既に投稿されていますが、まったく同じ問題を他の人に役立てるためだけですが、今回はライセンスAPIについてです。
上記のIAPライブラリと同じ5.0メッセージでエラーが発生しますが、修正を見つけることができます(LicenseChecker.Java(Googleのコード)で数行を手動で変更し、このライブラリを含むプロジェクトを再コンパイルすることを含む)。
チェックアウト: https://code.google.com/p/Android/issues/detail?id=78505 詳細誰でも使用できることを願っています。
これは私にとってはうまくいきましたが、これを行うには許容できる方法であることを知りたいです:
i.setClass(context、MyService.class);