【问题标题】:onActivityResult Never gets called Phonegap CordovaonActivityResult 永远不会被调用 Phonegap Cordova
【发布时间】:2013-08-08 11:57:03
【问题描述】:

我正在使用 ZXing 作为库项目的 PhoneGap 条形码扫描仪插件。

我的代码在 Galaxy Tab 2 (7") 上完美运行。相同的代码在 Galaxy S3 上无法运行。

问题:当 ZXing CaptureActivity 扫描条形码时,它只是完成了 CaptureActivity 并且 Calling 活动永远不会通过 onActivityResult 方法返回。

MainFest。

<activity
        android:name=".activity.MainActivity"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.Black.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.google.zxing.client.android.CaptureActivity"
        android:configChanges="orientation|keyboardHidden"
        android:screenOrientation="landscape"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:windowSoftInputMode="stateAlwaysHidden" >
        <intent-filter>
            <action android:name="com.phonegap.plugins.barcodescanner.SCAN" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

MainActivity.java

public void startActivityForResult(CordovaPlugin command, Intent intent,
        int requestCode) {
    this.activityResultCallback = command;
    this.activityResultKeepRunning = this.keepRunning;

    // If multitasking turned on, then disable it for activities that return
    // results
    if (command != null) {
        this.keepRunning = false;
    }

    // Start activity
    startActivityForResult(intent, requestCode);
}

protected void onActivityResult(int requestCode, int resultCode,
        Intent intent) {
    CordovaPlugin callback = this.activityResultCallback;
          if (callback != null) {
              callback.onActivityResult(requestCode, resultCode, intent);
          } else {
              Log.e(TAG, "Plugin callback null");
          }
      // else continue with any other code you need in the method

    super.onActivityResult(requestCode, resultCode, intent);


}

条码扫描器插件

private static final String SCAN_INTENT = "com.phonegap.plugins.barcodescanner.SCAN";
public void scan() {

    Intent intentScan = new Intent(SCAN_INTENT);
    intentScan.addCategory(Intent.CATEGORY_DEFAULT);
    this.cordova.startActivityForResult((CordovaPlugin) this, intentScan,
            AppConstants.CAMERA_SCAN_REQUEST_CODE);

}

我有 ZXing projet 作为图书馆项目。

我们将不胜感激。

【问题讨论】:

标签: android android-intent cordova zxing barcode-scanner


【解决方案1】:

Cordova web view documentation

您需要在您的活动中包含此代码:

@Override
public void setActivityResultCallback(CordovaPlugin plugin) {
    this.activityResultCallback = plugin;        
}

public void startActivityForResult(CordovaPlugin command, Intent intent, int requestCode) {
    this.activityResultCallback = command;
    this.activityResultKeepRunning = this.keepRunning;

    // If multitasking turned on, then disable it for activities that return results
    if (command != null) {
        this.keepRunning = false;
    }

    // Start activity
    super.startActivityForResult(intent, requestCode);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);
    CordovaPlugin callback = this.activityResultCallback;
    if (callback != null) {
        callback.onActivityResult(requestCode, resultCode, intent);
    }
}

此外:

this.cordova.startActivityForResult((CordovaPlugin) this, intentScan, AppConstants.CAMERA_SCAN_REQUEST_CODE);

您的插件中需要有以下方法:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    //do something with the result
    super.onActivityResult(requestCode, resultCode, intent);
}

【讨论】:

    【解决方案2】:

    尝试在调用活动 this.cordova.startActivityForResult((CordovaPlugin) this, intentScan, AppConstants.CAMERA_SCAN_REQUEST_CODE); 之前放置此 cordova.setActivityResultCallback (this);

    【讨论】:

      【解决方案3】:

      @aviv 给出的答案是绝对正确的,尽管在这种特殊情况下可能不会发生这种情况,但添加一个细节很重要:

      在插件中为您的意图设置标志时,您必须记住将标志设置为FLAG_ACTIVITY_SINGLE_TOP,而不是FLAG_ACTIVITY_NEW_TASK,否则您的 setResult() 方法将不会按预期返回。

      另外,请记住确保您的清单声明了 launchMode:

      android:launchMode="singleTop"
      

      Android 中有一个奇怪的问题,如果您作为单一顶级运行似乎可以正常工作,但如果您作为单一实例或单一任务运行,结果将立即返回。

      所以请记住在您即将从插件启动原生层时添加此内容

      Intent i = new Intent(cordova.getActivity(), ThanksActivity.class);
      i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
      cordova.startActivityForResult(this, i, 0);
      PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
      r.setKeepCallback(true);
      callbackContext.sendPluginResult(r);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-27
        • 2013-10-12
        • 2012-03-27
        • 2013-08-29
        • 2013-11-03
        相关资源
        最近更新 更多