Xamarin android - Попытка вызвать виртуальный метод sendBroadcast () для ссылки на пустой объект - PullRequest
0 голосов
/ 05 июня 2018

Я создаю кроссплатформенное приложение с использованием Xamarin, мое приложение будет загружать видео из Интернета, я выполнил функции загрузки и сохранения, но после сохранения видео в DCIM (в Android) видео не отображаются в галерее. Последень в поисках решений в интернете Я придумала два решения:

1.after загрузка завершена: отправьте трансляцию с действием "Intent.ActionMediaMounting".

2.after загрузка закончена Call "MediaScannerConnection.ScanFile ".

С решением 1 я получил:

" {Java.Lang.NullPointerException: попытка вызвать виртуальный метод void android.content.Context.sendBroadcast (android.content.Intent) 'для ссылки на пустой объект}

С решением 2 я получил:

"{Java.Lang.NullPointerException: попытка вызвать виртуальный метод' boolean android.content.Context.bindService(android.content.Intent, android.content.ServiceConnection, int) 'для ссылки на пустой объект}

Это мой интерфейс, который я используюd для обработки загрузки, помещенной в проект ПЛК:

namespace VideoDownloader
    {
      public interface IDownloadState
      {
          void OnDownloadStarted();
          void OnDownloadError();
          void OnDownloadFinished(string path);
       }
    }

Это мой файл MainPage.xaml.cs в проекте ПЛК:

namespace VideoDownloader
{
    public partial class MainPage : TabbedPage
    {

        public MainPage()
        {
            InitializeComponent();
        }

        public void downloadVideo(VideoInfor video, bool isRetried)
        {
          //download code here...                                    
          DependencyService.Get<IDownloadState()
          .OnDownloadFinished(video.path);
         }
    }

}

И это мой проект MainActivity в проекте Android, который реализует IDownloadStateи отправлять широковещательную рассылку, когда OnDownloadFinished сработало:

[assembly: Xamarin.Forms.Dependency(typeof(MainActivity))]
namespace VideoDownloader.Droid
{
    [Activity(Label = "VideoDownloader", Icon = "@mipmap/icon", Theme = 
"@style/MainTheme", MainLauncher = true, ConfigurationChanges = 
ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : 
global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity, 
IDownloadState
    {
        readonly string[] StoragePermissions =
        {
            Manifest.Permission.WriteExternalStorage,
            Manifest.Permission.ReadExternalStorage
        };

        const int RequestStorageId = 0;

        protected override void OnCreate(Bundle bundle)
        {
            TabLayoutResource = Resource.Layout.Tabbar;
            ToolbarResource = Resource.Layout.Toolbar;

            base.OnCreate(bundle);

            global::Xamarin.Forms.Forms.Init(this, bundle);
            LoadApplication(new App());
            int sdkBuildVersion = (int)Build.VERSION.SdkInt;
            Console.WriteLine("SDK build version = " + sdkBuildVersion);
            if (sdkBuildVersion >= 23)
            {
                RequestStoragePermission();
            }
        }

    public override void OnRequestPermissionsResult(int requestCode, 
                    string[] permissions, Permission[] grantResults)
        {
            switch (requestCode)
            {
                case RequestStorageId:
                    {
                        if (grantResults[0] == Permission.Granted)
                        {

                        }
                        else
                        {

                        }
                    }
                    break;
                default:
                    break;
            }
        }


        public void OnDownloadStarted()
        {
            throw new NotImplementedException();
        }

        public void OnDownloadError()
        {
            throw new NotImplementedException();
        }

        public void OnDownloadFinished(string path)
        {
            //Intent intent = new Intent(Intent.ActionMediaMounted);
            //SendBroadcast(intent);
            //throw new NotImplementedException();
            MediaScannerConnection.ScanFile(this, new String[] { 
              Android.OS.Environment
.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim)
.AbsolutePath }, null, null);
        }
    }
}

Я знаю, что есть много подобных вопросов для android по stackoverflow, которые возникли, но им, похоже, совсем не нравится моя ситуация.Так кто-нибудь знает, что я делаю не так?Почему это происходит?

1 Ответ

0 голосов
/ 06 июня 2018

С решением 2 я получил:

"{Java.Lang.NullPointerException: попытка вызвать виртуальный метод 'логический android.content.Context.bindService (android.content.Intent, android.content.ServiceConnection, int) 'для пустой ссылки на объект}

Пожалуйста, попробуйте использовать Forms.Context вместо this в OnDownloadFinished(). Например:

    public void OnDownloadFinished(string path)
    {
        //Intent intent = new Intent(Intent.ActionMediaMounted);
        //SendBroadcast(intent);
        //throw new NotImplementedException();
        MediaScannerConnection.ScanFile(Forms.Context, new String[] {
        Android.OS.Environment        
.GetExternalStoragePublicDirectory(Android.OS.Environment.DirectoryDcim)
.AbsolutePath }, null, null);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...