上下文:我正在创建一个自定义Cordova插件,它使用扫描程序本机功能,如扫描,打印,显示扫描文档(扫描仪上有一个屏幕,就像平板电脑一样)
代码本身工作正常(扫描程序在Android操作系统上运行),当我想将代码“转换”为Cordova插件时,事情变得棘手(我有已经为另一个项目完成了它并且它完美地工作了)。
问题:为了使用启动扫描的方法,我必须确保ScanService.java
中的所述方法(=它是一个具有{{的接口1}})是绑定的,可以通过这样的意图使用:
Abstract Class Stub extends android.os.Binder implements my.package.name.ScanService
ScanServConn变量:
Context ctx = this.cordova.getActivity().getApplicationContext();
public boolean BindServiceContext(Context ctx)
{
Intent myintent = new Intent("name.of.package.ScanService");
myintent.setPackage("name.of.package");
ctx.startService(myintent);
return ctx.bindService(myintent, ScanServConn, ctx.BIND_AUTO_CREATE);
}
此时,BindingServiceContext方法返回public ScanService mService;
public ServiceConnection ScanServConn = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
mService = ScanService.Stub.asInterface(service);
try
{
mService.initService(mScanCK);
mService.registerSystemCallBack(mSysCK);
mService.mountScannerDevice();
}
catch (RemoteException e)
{
e.printStackTrace();
}
}
@Override
public void onServiceDisconnected(ComponentName name)
{
try
{
if (mService != null)
{
mService.unmountScannerDevice();
mService.unregisterSystemCallBack(mSysCK);
mService.unregisterCallBack(mScanCK);
mService.uninitService();
}
}
catch (RemoteException e)
{
e.printStackTrace();
}
mService = null;
mSysCK = null;
mScanCK = null;
}
};
。
false
将插件添加到cordova项目并对其进行测试时出现的确切错误:
private void StartScan(String strScanProfilePath) //
{
try
{
int iRet = mService.getScannerDeviceStatus();
if ( iRet == Defination.PAPER_STATUS_ON_TRAY)
{
int ret = mService.setScanProfile(strScanProfilePath);
if (ret == Defination.ERROR_SUCCESS)
{
// Start scanning.
mService.scanStart();
}
}
}
catch (RemoteException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
在我的Attempt to invoke interface method 'int my.package.name.ScanService.getScannerDeviceStatus()' on a null object reference.
我添加了这一行,所以在项目的plugin.xml
我的服务被声明:
AndroidManifest.xml