Android Billing Client购买后无法授予SKU对应内容权限求助
Android内购交付权限问题解决方案
针对用户完成购买后无法获取对应内容权限的问题,结合代码中发现的4个潜在问题,给出以下修复方案:
1. 修复SKU匹配逻辑错误
handlePurchase方法中,purchase.getSkus()返回的是ArrayList<String>,直接与字符串执行equals比较会导致匹配失败,需修改为以下两种方式之一:
方式一:使用contains判断
// 原错误代码 if (purchase.getSkus().equals("10tl")) { ... } // 修改后 if (purchase.getSkus().contains("10tl")) { grantAccessToDiamond559(userId); }
方式二:取第一个SKU进行比较
String sku = purchase.getSkus().get(0); if (sku.equals("10tl")) { grantAccessToDiamond559(userId); }
2. 修正Firebase数据更新路径
grantAccessToDiamond559方法中,Firebase数据路径缺失用户profile层级,需补充完整路径:
// 原错误代码 databaseRef.child("credit").addListenerForSingleValueEvent(...); // 修改后 databaseRef.child("profiles").child(userId).child("credit") .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { // 原有业务逻辑保留 } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // 错误处理逻辑保留 } });
3. 替换重复触发的事件监听器
grantAccessToDiamond300方法中,addValueEventListener会在数据变化时重复触发,导致多次更新,需替换为单次执行的监听器:
// 原错误代码 databaseRef.child("profiles").child(userId).child("credit") .addValueEventListener(new ValueEventListener() { ... }); // 修改后 databaseRef.child("profiles").child(userId).child("credit") .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { // 原有业务逻辑保留 } @Override public void onCancelled(@NonNull DatabaseError databaseError) { // 错误处理逻辑保留 } });
4. 添加非空判断避免空指针异常
所有授予权限的方法中,需对credit值做非空校验,防止首次购买时credit为null引发崩溃:
@Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { // 原错误代码 int currentCredit = dataSnapshot.getValue(Integer.class); // 修改后 Integer currentCredit = dataSnapshot.getValue(Integer.class); if (currentCredit == null) { currentCredit = 0; } // 后续累加与更新逻辑保留 databaseRef.child("profiles").child(userId).child("credit").setValue(currentCredit + 559); }
完成以上修复后,重新测试内购流程,即可确保用户购买后能正确获取对应内容权限。
内容的提问来源于stack exchange,提问作者komutanlogar
相关产品推荐
相关产品推荐

