none
Zugriff auf Downloaddateien

    Frage

  • Ich habe, früher mit Delphi, jetzt mit Visual Studio 2015/2017 und C# schon viele Desktop-Programme geschrieben. Nun möchte ich für mein Android-Handy mit Xamarin meine 2 App erstellen. (Die 1. war eine "Hallo Welt" App).
    Ich möchte von OneDrive eine Datei auf das Handy herunterladen, auswerten und Teile davon zur Anzeige bringen.

    Der Download funktioniert mit folgendem Code:

    In der AndroidManifest.xml steht:

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    private void BtnDown_Click(object sender, EventArgs e)
    {
        picker = Picker.CreatePicker(ONEDRIVE_APP_ID);
        picker.StartPicking(this, LinkType.DownloadLink);
    }
    protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        var result = picker.GetPickerResult(requestCode, resultCode, data);
        if (result != null)
        {
            Download(result.Link, null))
        }
        else
            base.OnActivityResult(requestCode, resultCode, data);
        }
    }
    private void Download(Android.Net.Uri uri, View v)
    {
        if (uri != null)
        {
            if (v == null)
                v = new View(this);
            try
            {
                string downPath = ApplicationContext.GetExternalFilesDir(Android.OS.Environment.DirectoryDownloads).AbsolutePath;
                string downFn = „test.txt“;
                DownloadManager downloadManager = (DownloadManager)v.Context.GetSystemService(Context.DownloadService);
                Request request = new Request(uri);
                request.SetNotificationVisibility(visibility: Request.VisibilityVisibleNotifyCompleted);
                request.SetDestinationInExternalPublicDir(downPath, downFn);
                downloadManager.Enqueue(request);
                editDownFile.Text = System.IO.Path.Combine(downPath, downFn);
            }
            catch (Exception e)
            {
                Toast.MakeText(this, ("Error: " + e.Message, ToastLength.Long).Show();
            }
        }
    }

    Die Datei "test.txt" kann mit der auf dem Handy installierten "Download-App" angezeigt werden. Sie wird aber mit folgendem Code nicht in dem im EditText-Feld "editDownFile" angezeigten Verzeichnis gefunden:

    private void BtnLoad_Click(object sender, System.EventArgs e)
    {
        editFileData.Text = LoadFromFile(editDownFile.Text);
    }
    private string LoadFromFile(string Fn)
    {
        try
        {
            return System.IO.File.ReadAllText(Fn);
        }
        catch (Exception e)
        {
            Toast.MakeText(this, ("Error " + Fn + " nicht gefunden!  (" + e.Message + ")", ToastLength.Long).Show();ToastShow);
        }
        return "";
    }

    Es kommt immer die Fehlermeldung das die Datei nicht gefunden wird. Dateien die mit der App erstellt wurden, können gelesen werden. Nur die heruntergeladene Datei wird nicht gefunden. 
    Wenn sie mehrmals heruntergeladen wird, wird der Dateiname mit -1, -2 usw. erweitert. Wird das Verzeichnis geändert, zeigt die "Download-App" sie mehrmals mit dem gleichen Namen an. Da der Name nicht geändert wurde muss sie in dem anderen Verzeichnis liegen. Dies scheint zu funktionieren.

    Aber warum kann meine App sie nicht finden?
    Was mache ich falsch?

    Gruß Klaus

    Sonntag, 29. Oktober 2017 13:02

Antworten

  • Nach langem suchen habe ich den Fehler gefunden:

    request.SetDestinationInExternalPublicDir(downPath, downFn);

    verwendet: "/storage/emulated/0/" + downPath als Downloadverzeichnis. 

    Ich hatte in downPath immer den vollständigen Path angegeben. Nach der Änderung von

    string downPath = GetString(Resource.String.app_name);

    funktioniert der Code jetzt.

    • Als Antwort markiert Klaus Raabe Donnerstag, 7. Dezember 2017 17:32
    Donnerstag, 7. Dezember 2017 17:31