首页 > 解决方案 > react-native Android Module 打开 PassWallet

问题描述

我想在我的 react-native 应用程序中保存一个 .pkpass WalletPass。我使用此开发人员指南中的信息制作了一个模块:http: //passwallet.attidomobile.com/PassWallet%20Developer%20Guide.pdf我的模块如下所示:

PassWallet.java:

package mypackage;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;

import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;

public class PassWallet extends ReactContextBaseJavaModule {

    public PassWallet(ReactApplicationContext reactContext) {
        super(reactContext);
    }

    public String getName() {
        return "PassWallet";
    }

    @ReactMethod
    public void saveToPassWallet(String url) {
        launchPassWallet(getReactApplicationContext().getApplicationContext(), Uri.parse(url), true);
    }

    private boolean launchPassWallet(Context applicationContext, Uri uri, boolean launchGooglePlay) {

        if (null != applicationContext) {

            PackageManager packageManager = applicationContext.getPackageManager();

            if (null != packageManager) {

                final String strPackageName = "com.attidomobile.passwallet";

                Intent startIntent = new Intent();
                startIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startIntent.setAction(Intent.ACTION_VIEW);

                Intent passWalletLaunchIntent = packageManager.getLaunchIntentForPackage(strPackageName);
                if (null == passWalletLaunchIntent) {

                    // PassWallet isn't installed, open Google Play:
                    if (launchGooglePlay) {

                        String strReferrer = "";
                        try {
                            final String strEncodedURL = URLEncoder.encode(uri.toString(), "UTF-8");
                            strReferrer = "&referrer=" + strEncodedURL;
                        }
                        catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                            strReferrer = "";
                        }
                        try {
                            startIntent.setData(Uri.parse("market://details?id=" + strPackageName + strReferrer));
                            applicationContext.startActivity(startIntent);
                        }
                        catch (android.content.ActivityNotFoundException anfe) {
                            // Google Play not installed, open via website
                            startIntent.setData(Uri.parse("http://play.google.com/store/apps/details?id=" + strPackageName + strReferrer));
                            applicationContext.startActivity(startIntent);
                        }

                    }


                }
                else {

                    final String strClassName = "com.attidomobile.passwallet.activity.TicketDetailActivity";

                    startIntent.setClassName(strPackageName, strClassName);
                    startIntent.addCategory(Intent.CATEGORY_BROWSABLE);
                    startIntent.setDataAndType(uri, "application/vnd.apple.pkpass");

                    applicationContext.startActivity(startIntent);

                    return true;

                }
            }
        }
        return false;
    }

}

我正确添加了模块,并且可以在我的 react-native javascript 文件中打开它:

const AndroidWalletManager = NativeModules.PassWallet;
...

AndroidWalletManager.saveToPassWallet(url);
...

当我打开一个 .pkpass 文件并且未安装钱包应用程序(PassWallet,如开发人员指南的链接)时,Play 商店会正确打开。但是安装应用程序时会显示以下错误:

在此处输入图像描述

我不是android开发人员,所以也许这是一个基本问题,但我不知道如何解决这个问题。如果我不得不猜测我会说 PassWallet 应用程序更改了活动名称,这是正确的吗?我有这个解决方案大约两年了,它在过去有效。我联系了这个开发者指南的作者,但到目前为止没有得到回复。有一个更好的方法吗?

我只想能够将 .pkpass 直接保存到 android 上的钱包应用程序中。

标签: androidreact-native

解决方案


活动名称在 2.00.XX 大版本后更改 请在此处找到最新说明:https ://github.com/Kwiket/passwallet

密码钱包团队


推荐阅读