Я создаю кроссплатформенное приложение с использованием 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, которые возникли, но им, похоже, совсем не нравится моя ситуация.Так кто-нибудь знает, что я делаю не так?Почему это происходит?