繁体   English   中英

返回的intent总是以resultCode 0的形式接收并且Intent数据为null

Returning intent always received as resultCode 0 and Intent data is null

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有两个想要互相交流的应用程序。 App 1是Android Studio中用Java编码的旧应用程序App 2已使用Xamarin.Forms编写,但目前仅适用于Android

App 1包含它尝试与App 2中的信息一起更改的信息。App 1通过以下功能调用App 2:

private void launchApp(String packageName) {
    
    Intent launchIntent = getPackageManager().getLaunchIntentForPackage(packageName);
    
    String locationID = mCurrentJob.locationDetailDto.location;
    String taskID = String.valueOf(mCurrentJob.id);
    String userID = String.valueOf(Global.myUser.id);
    String deviceID = Urls.DEVICE_ID;

    if (launchIntent != null) {
        try {
            launchIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
            launchIntent.putExtra("LocationID", locationID);
            launchIntent.putExtra("TaskID", taskID);
            launchIntent.putExtra("UserID", userID);
            launchIntent.putExtra("DeviceID", deviceID);
            launchIntent.setFlags(0);
            launchIntent.setType("text/plain");
            startActivityForResult(launchIntent, LAUNCH_APP);
        } catch (ActivityNotFoundException error) {
            TelemetryLog.error(TAG, Statics.ERROR_MESSAGE_TRY_CATCH_BLOCK + error, error);
        }
    } else {
        TelemetryLog.debug(TAG, "[launchApp][Error]");
    }
}

这是同一文件/活动中的接收方代码:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // COMPLETION ACTIVITY
    
    if (resultCode == RESULT_OK) {
        switch (requestCode) {
            case LAUNCH_APP:
                String intentAssetID = Util.clean(data.getStringExtra("ID"));
                String intentAssetDescription = Util.clean(data.getStringExtra("Description"));
                String assetBarCode = Util.clean(data.getStringExtra("Barcode"));
                String assetNumberRef = Util.clean(data.getStringExtra("AssetNumber"));
                TelemetryLog.debug(TAG, "[onActivityResult]" + intentAssetID);
                TelemetryLog.debug(TAG, "[onActivityResult]" + intentAssetDescription);
                //If there is not (id + desc) and no barcode and no assetNumberRef
                if ((TextUtils.isEmpty(intentAssetID) || TextUtils.isEmpty(intentAssetDescription)) && TextUtils.isEmpty(assetBarCode) && TextUtils.isEmpty(assetNumberRef)) {
                    Toast.makeText(mContext, mContext.getString(R.string.completion_activity_no_asset_from_app), Toast.LENGTH_LONG).show();
                } else if (isPlanned) {
                    Toast.makeText(mContext, "Asset cannot be changes on a PPM job.", Toast.LENGTH_LONG).show();
                } else {
                    try {
                        if (!TextUtils.isEmpty(intentAssetID)) {
                            long id = Long.parseLong(intentAssetID);
                            mAssetUpdateRequired = true;
                            mNewAssetId = id;
                            mNewAssetDesc = intentAssetDescription;
                            showFieldsForNewAsset();
                        } else {
                            //The Asset app did not return an asset ID - it may have returned a barcode or reference
                            if (!TextUtils.isEmpty(assetBarCode)) {
                                mAssetUpdateRequired = true;
                                mNewAssetId = -1;
                                mAssetBarCode = assetBarCode;
                                mNewAssetDesc = "Barcode: " + assetBarCode; //Use asset barcode for displayed description
                                showFieldsForNewAsset();
                            } else if (!TextUtils.isEmpty(assetNumberRef)) {
                                mAssetUpdateRequired = true;
                                mNewAssetId = -1;
                                mAssetNumRef = assetNumberRef;
                                mNewAssetDesc = "Asset Number: " + assetNumberRef; //Use asset number ref for displayed description
                                showFieldsForNewAsset();
                            }
                        }
                        
                    } catch (Exception e) {
                        Toast.makeText(mContext, mContext.getString(R.string.completion_activity_no_asset_from_app), Toast.LENGTH_LONG).show();
                        TelemetryLog.error(TAG, "[onActivityResult][LAUNCH_APP] " + Statics.ERROR_MESSAGE_TRY_CATCH_BLOCK + e, e);
                    }
                }
                break;
            default:
                super.onActivityResult(requestCode, resultCode, data);
                break;
        }
    }
}

在App 2上,信息可以正确接收,可以使用一系列选项,一个选项被选中,按下按钮后,所选项目将转换为所需的格式化模型。 然后,我使用MessagingCenter将其从Forms端传递到Android端,这就是接收消息的位置并回调到App 1:

protected override void OnStart()
    {
        base.OnStart();
        // App should return here after Submitting an Asset from the DetailsPage
        Xamarin.Forms.MessagingCenter.Subscribe<DetailsPage, SendAsset>(this, "Asset", (sender, arg) =>
        {
            SendAsset asset = arg;
            if (asset != null)
            {
                ReturnToCaller(asset);
            }
        });
    }

public void ReturnToCaller(SendAsset assetDetails)
    {
        Intent returnAsset = new Intent(Intent.ActionSend);

        returnAsset.PutExtra("ID", assetDetails.ID);
        returnAsset.PutExtra("AssetNumber", assetDetails.Code);
        returnAsset.PutExtra("Description", assetDetails.Description);
        returnAsset.PutExtra("Barcode", assetDetails.Barcode);
        returnAsset.PutExtra("Serial", assetDetails.Serial);
        SetResult(Result.Ok, returnAsset);
        Finish();
    }

现在,所有这些代码都可以正常工作,直到在App 1上达到“ onActivityResult”。我已经通过以下步骤调试了两端的意图的多个部分(例如,删除标志,删除类型,指定类型),我可以看到返回意图是预期的。 它填充了Extras,并标有ReultCode.OK(-1),但每次到达App 1时,resultCode始终为0,并且与调用App 2时的requestCode相匹配。

我是否错过了明显的事情? 还是存在一些更深层次的路由问题? 非常感谢任何建议,因为我对此非常执着,在此先感谢您。

注意:我已经清理了代码以适合此处,并删除了不相关的部分或只是将其注释掉,并更改了一些内容,以便代码保持匿名。

更新:所以我对此仍然有一些麻烦,但是我发现我一直收到resultCode 0和NULL意向数据的原因是因为我从MainActivity而不是设置为MainLauncher的SplashScreen调用SetResult和Finish对于该应用程序。 现在它将返回正确的结果,但仅在处理SplashScreen时调用。 如果我尝试使用MessagingCenter从“表单”页面订阅响应(在该页面上我获取详细信息),则会收到两次该消息,并且不会关闭该应用程序(因此根本不会返回到应用程序1)

我正在尝试找到正确的方式来订阅此MessagingCenter,但无论我将“订阅”和“取消订阅”放在应用程序生命周期中的哪个位置,它都将调用两次或根本不调用。

问题暂未有回复.您可以查看右边的相关问题.
2 为什么intent.getStringExtra总是为null?

我看了看。 尝试了很多事情,但没有返回任何数据(无论数据是否存在) 该信息的传递方式为:-&gt;注意我发布了错误的代码段,请参见下文 在onCreate中收到: groupId始终返回null。 在调试组中,显示Intent-&gt; mExtras-&gt; mMa ...

3 使用Tabactivity结果代码为0,返回Intent数据为null

我在活动中有一个Mainactivity,如果单击该按钮,它会显示包含联系人和群组活动的Tabactivity。如果我们选择使用contact或group复选框,则它必须自动进入带有我们内容的editbox选择一个。 但是现在,如果我选择联系人中的任何内容或对其进行分组,则其不会显示在ed ...

5 通过Intent传递数据并接收它

我试图通过我的Intent将数据传递到下一个活动,这样我就可以收到它并给出一个计时器值。 我已经尝试了不同的接收值的方法,并且我不断收到强制关闭或编译器错误。 我知道这很简单所以有人可以告诉我如何做到这一点。 先感谢您! 我尝试传入int length = beefTy ...

6 使用Intent接收数据

我正在尝试使用Intent从我的NoteActivity向MainActivity类的方法(addNote())发送一些数据 当我在onCreate()方法中以(title)形式接收(str)时,一切正常,并且我接收到数据,但是当我尝试在addNote()方法中接收Intent时,我没有 ...

8 有时intent返回null

在登录活动中,我有以下几行: 我在登录活动中从onCreate调用startMainActivity方法。 这是我的主要活动onCreate方法: 我的应用程序版本是17但有时Log.w正在为App version编写1我的意思是有时意图获得空值。但为什么? 我该如何解决 ...

2015-02-25 00:01:11 1 42   android
9 intent.getAction()返回NULL

在我的应用程序中,我添加了一个启动画面,我创建了启动活动,并对清单文件进行了适当的更改。 但是,当我现在运行我的应用程序时,启动屏幕会显示其分配的时间,然后返回NullPointerException。 问题是由于 在我的splash重定向到的类的第241行,intent.getAc ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM