代码之家  ›  专栏  ›  技术社区  ›  Theodorus Agum Gumilang

尝试在Xamarin窗体上实现ImagePicker时出错

  •  0
  • Theodorus Agum Gumilang  · 技术社区  · 8 年前

    您好,我试图在我的xamarin表单上实现ImagePicker,但我的MainActivty OnActivityResult有问题,每当我选择图像时,它都会收到此错误消息

    android.runtime.JavaProxyThrowable: System.NullReferenceException: Object reference not set to an instance of an object
      at Microsoft.Identity.Client.WebUI.SetAuthorizationResult (Microsoft.Identity.Client.Internal.AuthorizationResult authorizationResultInput) [0x00006] in <df3bbcf06538443e9963d82dd707b6fa>:0 
      at Microsoft.Identity.Client.AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs (System.Int32 requestCode, Android.App.Result resultCode, Android.Content.Intent data) [0x00032] in <df3bbcf06538443e9963d82dd707b6fa>:0 
      at KGVC.Droid.MainActivity.OnActivityResult (System.Int32 requestCode, Android.App.Result resultCode, Android.Content.Intent data) [0x0000b] in <e83f90a066ab4f6c95402217456751e2>:0 
      at Android.Support.V4.App.FragmentActivity.n_OnActivityResult_IILandroid_content_Intent_ (System.IntPtr jnienv, System.IntPtr native__this, System.Int32 requestCode, System.Int32 native_resultCode, System.IntPtr native_data) [0x00014] in <7a2a36256f1648ecbd0c15a75bc5a349>:0 
      at (wrapper dynamic-method) System.Object:409b2b82-0807-4c59-b475-d61eb538da78 (intptr,intptr,int,int,intptr)
        at md5926298ec23f3b6e841a6fb18f139a084.MainActivity.n_onActivityResult(Native Method)
        at md5926298ec23f3b6e841a6fb18f139a084.MainActivity.onActivityResult(MainActivity.java:39)
        at android.app.Activity.dispatchActivityResult(Activity.java:6533)
        at android.app.ActivityThread.deliverResults(ActivityThread.java:3919)
        at android.app.ActivityThread.handleSendResult(ActivityThread.java:3966)
        at android.app.ActivityThread.access$1500(ActivityThread.java:180)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1545)
        at android.os.Handler.dispatchMessage(Handler.java:111)
        at android.os.Looper.loop(Looper.java:207)
        at android.app.ActivityThread.main(ActivityThread.java:5795)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:907)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:768)
    

    我对这个问题的第一个想法是,我的PicturePickerImplementation中的resultcode替换了AzureB2c的resultcode,这是因为当我尝试删除此代码时 AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs(requestCode, resultCode, data); 从我的OnActivityResult来看,它将起到魅力的作用,我的问题是如何解决这一冲突? 这是我的完整代码

    public static readonly int PickImageId=1000;

    public TaskCompletionSource<Stream> PickImageTaskCompletionSource { set; get; }
    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);
            AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs(requestCode, resultCode, data);
    
            if (requestCode == PickImageId)
            {
                if ((resultCode == Result.Ok) && (data != null))
                {
                    Android.Net.Uri uri = data.Data;
                    Stream stream = ContentResolver.OpenInputStream(uri);
    
                    // Set the Stream as the completion of the Task
                    PickImageTaskCompletionSource.SetResult(stream);
                }
                else
                {
                    PickImageTaskCompletionSource.SetResult(null);
                }
            }
        }
    

    这是我的家属服务

    using System;
    using System.IO;
    using System.Threading.Tasks;
    
    using Android.Content;
    
    using Xamarin.Forms;
    
    using KGVC.Droid;
    using KGVC.Interfaces;
    
    [assembly: Dependency(typeof(PicturePickerImplementation))]
    namespace KGVC.Droid
    {
        public class PicturePickerImplementation : IPicturePicker
        {
            public Task<Stream> GetImageStreamAsync()
            {
                // Define the Intent for getting images
                Intent data = new Intent();
                data.SetType("image/*");
                data.SetAction(Intent.ActionGetContent);
    
                // Get the MainActivity instance
                MainActivity activity = Forms.Context as MainActivity;
    
                // Start the picture-picker activity (resumes in MainActivity.cs)
                activity.StartActivityForResult(
                    Intent.CreateChooser(data, "Select Picture"),
                    MainActivity.PickImageId);
    
                // Save the TaskCompletionSource object as a MainActivity property
                activity.PickImageTaskCompletionSource = new TaskCompletionSource<Stream>();
    
                // Return Task object
                return activity.PickImageTaskCompletionSource.Task;
            }
        }
    }
    

    有什么解决我问题的建议吗?谢谢 编辑: 经过一点观察,我注意到一些奇怪的行为触发了这个错误。我的错误只有在我成功登录后才会出现,然后我关闭应用程序并从后台将其杀死,要使我的选择器图像正常工作,我应该做的是1。使我的应用程序在后台2上运行。再次重新登录,我可以再次使用图像选择器。有人遇到过这个问题吗?

    1 回复  |  直到 8 年前
        1
  •  1
  •   Elvis Xia - MSFT    8 年前

    我对这个问题的第一个想法是,我的PicturePickerImplementation中的resultcode替换了AzureB2c的resultcode,这是因为当我尝试删除这个代码AuthenticationAgentContinuationHelper时。SetAuthenticationAgentContinuationEventArgs(请求代码、结果代码、数据);从我的OnActivityResult来看,它将起到魅力的作用,我的问题是如何解决这一冲突?

    OnActivityResult 将在您呼叫时触发 PublicClientApplication.AcquireTokenAsync 当你打电话的时候 StartActivityForResult . 因此,应根据请求代码将两部分逻辑分开:

    if (requestCode == PickImageId)
        {
            if ((resultCode == Result.Ok) && (data != null))
            {
                Android.Net.Uri uri = data.Data;
                Stream stream = ContentResolver.OpenInputStream(uri);
    
                // Set the Stream as the completion of the Task
                PickImageTaskCompletionSource.SetResult(stream);
            }
            else
            {
                PickImageTaskCompletionSource.SetResult(null);
            }
        }else
        {
          AuthenticationAgentContinuationHelper.SetAuthenticationAgentContinuationEventArgs(requestCode, resultCode, data);
        }