为什么当我试图从Java连接设备监听模块时,我的Android本机应用程序会立即崩溃

为什么当我试图从Java连接设备监听模块时,我的Android本机应用程序会立即崩溃,java,android,react-native,Java,Android,React Native,我有一个java模块,可以检测读卡器外围设备是否连接到android手机。它在完整的android版本中运行良好,如果外围设备未连接,则会显示祝酒词,这是正常工作的完整本机java代码: public class MainActivity extends AppCompatActivity { private SwipeHandler handler; @Override protected void onCreate(Bundle savedInstanceState) { sup

我有一个java模块,可以检测读卡器外围设备是否连接到android手机。它在完整的android版本中运行良好,如果外围设备未连接,则会显示祝酒词,这是正常工作的完整本机java代码:

public class MainActivity extends AppCompatActivity {
private SwipeHandler handler;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    run();
}

public void run(){
    SwipeListener listener = new SwipeListener() {

        @Override
        public void onDisconnected(SwipeEvent swipeEvent) {

            Toast someToast = Toast.makeText(getApplicationContext(),"Card is disconnected!", Toast.LENGTH_LONG);
            someToast.show();

        }

        @Override
        public void onConnected(SwipeEvent swipeEvent) {

        }

        @Override
        public void onStarted(SwipeEvent swipeEvent) {

        }

        @Override
        public void onStopped(SwipeEvent swipeEvent) {

        }

        @Override
        public void onReadData(SwipeEvent swipeEvent) {

        }

        @Override
        public void onParseData(SwipeEvent swipeEvent) {

        }

        @Override
        public void onICDetected(SwipeEvent swipeEvent) {

        }
    };

    handler = new SwipeHandler(this);
    handler.addSwipeListener(listener);
    handler.setReadonly(true);
    handler.powerOn();
}
}

现在,在遵循react本机文档中的模块桥接说明之后,我已经编写了下面的代码,将此功能引入react本机应用程序。模块代码:

public class mreaderManager extends ReactContextBaseJavaModule {

    private SwipeHandler handler;

    public mreaderManager(ReactApplicationContext reactContext){

        super(reactContext);

        run();

    }

    //override getName function
    @Override
    public String getName(){
        return "mreaderManager";
    }

    //function body
    @ReactMethod
    public void greetUser(String name, Callback callback){

        String greeting = "Welcome " + name;

        callback.invoke(greeting);

    }

    public void run(){

        //declare swipe listener
        SwipeListener listener = new SwipeListener() {

            @Override
            public void onDisconnected(SwipeEvent swipeEvent) {

                Toast someToast = Toast.makeText(getReactApplicationContext(),"Card is disconnected!", Toast.LENGTH_LONG);
                someToast.show();

            }

            @Override
            public void onConnected(SwipeEvent swipeEvent) {

            }

            @Override
            public void onStarted(SwipeEvent swipeEvent) {

            }

            @Override
            public void onStopped(SwipeEvent swipeEvent) {

            }

            @Override
            public void onReadData(SwipeEvent swipeEvent) {

            }

            @Override
            public void onParseData(SwipeEvent swipeEvent) {

            }

            @Override
            public void onICDetected(SwipeEvent swipeEvent) {

            }
        };

        //instantiate swipe handler
        handler = new SwipeHandler(getReactApplicationContext());
        handler.addSwipeListener(listener);
        handler.setReadonly(true);
        handler.powerOn();

    }

}
以下是软件包代码:

public class mreaderPackage implements ReactPackage {

    @Override
    public List
            <Class<? extends JavaScriptModule>>
    createJSModules(){
        return Collections.emptyList();
    }

    @Override
    public List
            <ViewManager> createViewManagers(ReactApplicationContext reactContext){
        return Collections.emptyList();
    }

    @Override
    public List
            <NativeModule> createNativeModules(ReactApplicationContext reactContext){
        List<NativeModule> modules = new ArrayList<>();
        modules.add(new mreaderManager(reactContext));

        return modules;
    }

}
public类mreaderPackage实现ReactPackage{
@凌驾
公开名单
更新:

在仔细考虑了一下情况之后,我注意到imagpay库正在使用耳机插头来完成它的工作,并且耳机插头的用途是“粘性的”。这意味着耳机的插入意图可以挂在系统中,应用程序在注册接收器后立即接收。这可能解释了为什么这些事件在SwipeHander仍在构建自身时出现时会产生错误。因此,一种可能的解决方法(假设上述分析是正确的)是在创建新的SwipeHandler之前读取现有意图。下面是一个可能有效的示例(摘自):

注意:我认为创建、注册和注销可能应该移动到活动的onStart()和onStop()生命周期方法


从logcat中,错误是由于在SwipeHandler类中接收到NullPointerException引起的。您尚未发布SwipeHandler类的代码,因此我无法进一步诊断。问题发生在此处:

com.imagpay.SwipeHandler.isReadable(SourceFile:655)
它试图从isReadable方法中的null对象中计算出状态

可能是imagpay库开发用于Android应用程序,而不是专门用于React本机应用程序。在这种情况下,问题可能源于您在每种情况下创建SwipeHandler的方式。在上面的代码中有两个地方可以初始化SwipeHandler,其中一个是React本机v版本:

handler = new SwipeHandler(getReactApplicationContext());
也许您可以尝试将其引用到实际的Android应用程序上下文中。例如:

 handler = new SwipeHandler(getReactApplicationContext().getBaseContext());
更新:

在仔细考虑了一下情况之后,我注意到imagpay库正在使用耳机插头来完成它的工作,并且耳机插头的用途是“粘性的”。这意味着耳机的插入意图可以挂在系统中,应用程序在注册接收器后立即接收。这可能解释了为什么这些事件在SwipeHander仍在构建自身时出现时会产生错误。因此,一种可能的解决方法(假设上述分析是正确的)是在创建新的SwipeHandler之前读取现有意图。下面是一个可能有效的示例(摘自):

注意:我认为创建、注册和注销可能应该移动到活动的onStart()和onStop()生命周期方法


从logcat中,错误是由于在SwipeHandler类中接收到NullPointerException引起的。您尚未发布SwipeHandler类的代码,因此我无法进一步诊断。问题发生在此处:

com.imagpay.SwipeHandler.isReadable(SourceFile:655)
它试图从isReadable方法中的null对象中计算出状态

可能是imagpay库开发用于Android应用程序,而不是专门用于React本机应用程序。在这种情况下,问题可能源于您在每种情况下创建SwipeHandler的方式。在上面的代码中有两个地方可以初始化SwipeHandler,其中一个是React本机v版本:

handler = new SwipeHandler(getReactApplicationContext());
也许您可以尝试将其引用到实际的Android应用程序上下文中。例如:

 handler = new SwipeHandler(getReactApplicationContext().getBaseContext());

您是否尝试过将run方法移动到onStart,或者将其延迟放到线程中?(显然必须在onStop中清理它)。另外,你能从LogCat添加一些崩溃信息吗?您好,我在从我的设备获取崩溃日志时遇到问题。我刚刚通过电子邮件给自己发送了一个。我编辑了原始问题以显示崩溃日志。您尝试将run方法移动到onStart,或者延迟将其放入线程中?(显然必须在onStop中清理)。另外,你能从LogCat添加一些崩溃信息吗?你好,我在从我的设备获取崩溃日志时遇到了问题。我刚刚通过电子邮件给自己发送了一个。我编辑了原始问题以显示崩溃日志,swipehandler类来自一个.jar库。我已经将android项目和react本机项目加载到github,这样你就可以我看一下代码:本机和RN版本,我只是想补充一下,当外围设备连接时,应用程序不会崩溃,但屏幕是空白的。这里有一个指向swipehandler代码的链接。特别抱歉,我假设swipehandler是你的。你可能需要联系库提供商,看看你是否在t初始化,以及库是否与React-Native兼容。提供商甚至不知道React-Native是什么lol。我发现这和在应用程序关闭后销毁处理程序有关。因为我必须重新启动手机或连接外围设备,以便应用程序在初始运行后运行。是否有任何代码会杀死destroy上的任何设备侦听代码?好的,swipehandler类来自一个.jar库。我已经将android项目和react native项目加载到github,这样您可以查看代码:native和RN版本。我只是想添加,当外围设备连接时,应用程序不会崩溃,但屏幕是空白的。下面是一个示例指向swipehandler代码的链接特别抱歉,我假设swipehandler是您的。您可能需要联系库提供商,查看初始化过程中是否缺少某些内容,以及库是否为co