Android IAB:设备上的计费服务不可用
Android IAB: Billing service unavailable on device
我正在尝试在我的应用中实施 IAB。每次应用程序启动时,启动失败并显示:
Problem setting up In-app Billing: IabResult: Billing service unavailable on device. (response: 3:Billing Unavailable)
我几乎什么都试过了:
- 确保我在清单中拥有
com.android.vending.BILLING
权限。
- 正在将两个版本对应的 APK 上传到 Beta 频道。
- 使用测试帐户。
- 正在清除 Google 播放缓存。
- 确保我的
build.gradle
中有最新的 Google Play 服务。
- 仔细检查 public 编码密钥。
- 使用多个设备。
但无论如何,错误依旧存在。我已经阅读了所有关于它的问题和答案,但我不知道我错过了什么!
这是我的相关代码:
public class MainActivity extends AppCompatActivity {
IabHelper mHelper;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHelper = new IabHelper(this, Billing.ENCODED_PUBLIC_KEY);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
// Oh noes, there was a problem.
Log.d("LOG", "Problem setting up In-app Billing: " + result);
}
// Hooray, IAB is fully set up!
}
});
final SharedPreferences saved_values = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
IabHelper.QueryInventoryFinishedListener mGotInventoryListener
= new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
if (result.isFailure()) {
SettingsActivity.premium = saved_values.getBoolean("premium",false);
}
else {
// does the user have the premium upgrade?
SettingsActivity.premium = inventory.hasPurchase(Billing.SKU_PREMIUM);
// update UI accordingly
}
}
};
try{
mHelper.queryInventoryAsync(mGotInventoryListener);
}
catch (Exception e){
SettingsActivity.premium = saved_values.getBoolean("premium",false);
}
}
@Override public void onDestroy() {
super.onDestroy();
if (mHelper != null)
mHelper.dispose();
mHelper = null;
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i("LOG", "onActivityResult(" + requestCode + "," + resultCode + "," + data);
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
else {
Log.i("LOG", "onActivityResult handled by IABUtil.");
}
}
控制台输出如下:
03-11 20:35:27.896 710-710/? W/ActivityManager: Permission Denial: getCurrentUser() from pid=14441, uid=10189 requires android.permission.INTERACT_ACROSS_USERS
03-11 20:35:28.516 14441-14441/com.johan.app D/LOG: Problem setting up In-app Billing: IabResult: Billing service unavailable on device. (response: 3:Billing Unavailable)
03-11 20:35:28.516 14441-14441/com.johan.app E/IabHelper: In-app billing error: Illegal state for operation (queryInventory): IAB helper is not set up.
请注意,我在其他地方有查询库存的代码,但它没有超出 mHelper.startUpSetup()
的事实使其无关紧要。
试试这个!只需转到 IabHelper class,在 onServiceConnected 回调下的 startSetup 方法中。你可以看到一个 Intent,只需替换为下面的代码。 (或仅查找 BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE)。
Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0).isEmpty()) {
// service available to handle that Intent
mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
}
else {
// no service available to handle that Intent
if (listener != null) {
listener.onIabSetupFinished(
new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE,
"Billing service unavailable on device."));
}
}
如果您的目标是 android 31,请将其放入清单中:
<permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
</intent>
</queries>
我正在尝试在我的应用中实施 IAB。每次应用程序启动时,启动失败并显示:
Problem setting up In-app Billing: IabResult: Billing service unavailable on device. (response: 3:Billing Unavailable)
我几乎什么都试过了:
- 确保我在清单中拥有
com.android.vending.BILLING
权限。 - 正在将两个版本对应的 APK 上传到 Beta 频道。
- 使用测试帐户。
- 正在清除 Google 播放缓存。
- 确保我的
build.gradle
中有最新的 Google Play 服务。 - 仔细检查 public 编码密钥。
- 使用多个设备。
但无论如何,错误依旧存在。我已经阅读了所有关于它的问题和答案,但我不知道我错过了什么!
这是我的相关代码:
public class MainActivity extends AppCompatActivity {
IabHelper mHelper;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHelper = new IabHelper(this, Billing.ENCODED_PUBLIC_KEY);
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
// Oh noes, there was a problem.
Log.d("LOG", "Problem setting up In-app Billing: " + result);
}
// Hooray, IAB is fully set up!
}
});
final SharedPreferences saved_values = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
IabHelper.QueryInventoryFinishedListener mGotInventoryListener
= new IabHelper.QueryInventoryFinishedListener() {
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
if (result.isFailure()) {
SettingsActivity.premium = saved_values.getBoolean("premium",false);
}
else {
// does the user have the premium upgrade?
SettingsActivity.premium = inventory.hasPurchase(Billing.SKU_PREMIUM);
// update UI accordingly
}
}
};
try{
mHelper.queryInventoryAsync(mGotInventoryListener);
}
catch (Exception e){
SettingsActivity.premium = saved_values.getBoolean("premium",false);
}
}
@Override public void onDestroy() {
super.onDestroy();
if (mHelper != null)
mHelper.dispose();
mHelper = null;
}
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) {
Log.i("LOG", "onActivityResult(" + requestCode + "," + resultCode + "," + data);
// Pass on the activity result to the helper for handling
if (!mHelper.handleActivityResult(requestCode, resultCode, data)) {
super.onActivityResult(requestCode, resultCode, data);
}
else {
Log.i("LOG", "onActivityResult handled by IABUtil.");
}
}
控制台输出如下:
03-11 20:35:27.896 710-710/? W/ActivityManager: Permission Denial: getCurrentUser() from pid=14441, uid=10189 requires android.permission.INTERACT_ACROSS_USERS
03-11 20:35:28.516 14441-14441/com.johan.app D/LOG: Problem setting up In-app Billing: IabResult: Billing service unavailable on device. (response: 3:Billing Unavailable)
03-11 20:35:28.516 14441-14441/com.johan.app E/IabHelper: In-app billing error: Illegal state for operation (queryInventory): IAB helper is not set up.
请注意,我在其他地方有查询库存的代码,但它没有超出 mHelper.startUpSetup()
的事实使其无关紧要。
试试这个!只需转到 IabHelper class,在 onServiceConnected 回调下的 startSetup 方法中。你可以看到一个 Intent,只需替换为下面的代码。 (或仅查找 BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE)。
Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
serviceIntent.setPackage("com.android.vending");
if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0).isEmpty()) {
// service available to handle that Intent
mContext.bindService(serviceIntent, mServiceConn, Context.BIND_AUTO_CREATE);
}
else {
// no service available to handle that Intent
if (listener != null) {
listener.onIabSetupFinished(
new IabResult(BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE,
"Billing service unavailable on device."));
}
}
如果您的目标是 android 31,请将其放入清单中:
<permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<queries>
<intent>
<action android:name="android.intent.action.MAIN" />
</intent>
</queries>