none
Wo werden Bilder in Windows10 Contact abgespeichert? RRS feed

  • Frage

  • Hallo,

    in Windows 10 Contact gibt es IRandomAccessStreamReference auf das Bild des Kontaktes.

     contact.SourceDisplayPicture; // 768 x 768
     contact.LargeDisplayPicture;  // 768 x 768
     contact.SmallDisplayPicture;  // 99 x 99
     contact.Thumbnail;               // 99 x 99

    SourceDisplayPicture kann man neu setzen. Aber wo werden die Bilder tatsächlich gespeichert?

    Eine Referenz kann es eigentlich nicht sein, denn wenn ich die Bilder umbenenne oder verschiebe
    wird in den Kontakten immer noch das Bild angezeigt.

    Ich will das die Kontakte mit dem Bild in eine andere Datei schreiben um sie ggf. anderen Anwendungen zur Verfügung zu stellen, diese Kontakte aber auch neu in die Windows Kontakte laden. Dann eventuell mit einem neuen oder anderen Bild.

    Danke für eure Hilfe!

    Gruß Klaus

    Donnerstag, 15. September 2016 11:41

Antworten

Alle Antworten

  • Hallo Klaus,

    wenn ich raten müsste, würde ich sagen dass die Bilder primär in der Cloud gespeichert und dann nur irgendwo lokal synchronisiert werden. Ein einfaches austauschend er Datei dürfte da nichts bringen.

    Hast du mal versucht SourceDisplayPicture zuzuweisen bzw. den Inhalt als Datei zu speichern? Das wäre mein erster Versuch, da die MSDN vermuten lässt dass es so angedacht ist:

    Gets or sets the display picture for the Contact in its original size.
    Quelle: https://msdn.microsoft.com/en-us/library/windows/apps/windows.applicationmodel.contacts.contact.aspx

    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Donnerstag, 15. September 2016 16:39
  • Hallo Tom, danke für die Antwort.

    Das einfache Zuweisen einer Referenz ohne das tatsächlich eine Datei dahinter steht, wie z.B. aus meinem Datensatz, funktioniert zwar aber ein Bild wir in den Kontakten nicht angezeigt. Es fehlt also die Datei. Werde wohl nicht umhin kommen in meine System die Bilder tatsächlich als Dateien abzuspeichern und sie dann auch nur von dort innerhalb der Kontakte zu verwenden. Werde aber noch weiter experimentieren. 

    Habe aber ein neues Problem:

    Offensichtlich kann man nicht auf mit StrorageFolder und StorageFile auf beliebige Ordner und Dateien zugreifen. Das Ansprechen von z.B. F:\MyFolder oder F:\MyFolder\MyFile wird mit einem Fehler abgebrochen.

    Gruß Klaus

    Freitag, 16. September 2016 14:45
  • Hallo,

    das ist bei UWP auch ganz normal.

    Schreibrechte hast du nur auf Daten in deinem App Ordner und auf Daten und Ordner die der User dir zur Verfügung stellt, z.B. mit Windows.Storage.Pickers.FileOpenPicker oder Windows.Storage.Pickers.FolderPicker.

    Die rechte auf diese Ordner und Dateien hast du nur für die dauer der Instanz danach verlierst du sie wieder.

    Gruß

    Thomas


    Icon für UWP: https://www.microsoft.com/store/apps/9nblggh5fzpm

    Montag, 19. September 2016 21:37
  •  

    Schreibrechte hast du nur auf Daten in deinem App Ordner und auf Daten und Ordner die der User dir zur Verfügung stellt, z.B. mit Windows.Storage.Pickers.FileOpenPicker oder Windows.Storage.Pickers.FolderPicker.


    Hallo Thomas,

    soweit so gut. Was mache ich aber wenn ich FileOpenPicker oder Folderpicker nicht verwenden will weil z.B. zwei verschiedene Anwendungen in einem gemeinsamen Ordner, der extra für diese Anwendungen angelegt ist, zugreifen möchten?

    Wenn ich, wie in meinem nachstehenden Beispiel die Datei löschen will ohne dass ich mir das Storagefile aus dem vorherigen Zugriff gemerkt habe und damit file definiere?

    private async void buttonPickFolderWrite_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) { try { FileSavePicker savePicker = new FileSavePicker(); // Initial search path savePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; // savePicker.SuggestedStartLocation = PickerLocationId.ComputerFolder; // savePicker.SuggestedStartLocation = PickerLocationId.Desktop; // savePicker.SuggestedStartLocation = PickerLocationId.Downloads; // savePicker.SuggestedStartLocation = PickerLocationId.HomeGroup; // savePicker.SuggestedStartLocation = PickerLocationId.MusicLibrary; // savePicker.SuggestedStartLocation = PickerLocationId.Objects3D; // savePicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; // savePicker.SuggestedStartLocation = PickerLocationId.VideosLibrary; // Dropdown of file types the user can save the file a savePicker.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt" }); // Default extension if the user does not select a choice explicitly from the dropdown savePicker.DefaultFileExtension = ".txt"; // Default file name if the user does not type one in or select a file to replace savePicker.SuggestedFileName = filename; StorageFile file = await savePicker.PickSaveFileAsync(); if (null != file) { // Note the file path to delete fileToDelete = file; // Application now has read/write access to the saved file await Windows.Storage.FileIO.WriteTextAsync(file, "Hello, This is text file"); Commandbar.Content = "Your File Successfully Saved"; } else { Commandbar.Content = "No save"; } } catch { Commandbar.Content = "Error saveing"; } } private async void buttonPickFolderRead_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) { try { FileOpenPicker openPicker = new FileOpenPicker(); // Explorer type of advertisement openPicker.ViewMode = PickerViewMode.List; // Initial search path openPicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary; // openPicker.SuggestedStartLocation = PickerLocationId.ComputerFolder; // openPicker.SuggestedStartLocation = PickerLocationId.Desktop; // openPicker.SuggestedStartLocation = PickerLocationId.Downloads; // openPicker.SuggestedStartLocation = PickerLocationId.HomeGroup; // openPicker.SuggestedStartLocation = PickerLocationId.MusicLibrary; // openPicker.SuggestedStartLocation = PickerLocationId.Objects3D; // openPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary; // openPicker.SuggestedStartLocation = PickerLocationId.VideosLibrary; // Default of file types openPicker.FileTypeFilter.Add(".txt"); // OK // File selection StorageFile file = await openPicker.PickSingleFileAsync(); if (file != null) { Commandbar.Content = file.Name; } else { Commandbar.Content = "No open"; } } catch { Commandbar.Content = "Error opening"; } } private async void buttonPickFolderDelete_Click(object sender, Windows.UI.Xaml.RoutedEventArgs e) { try {

    // Wie ???????? // StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("Test.txt"); StorageFile file = fileToDelete; if (file != null) { await file.DeleteAsync(); Commandbar.Content = file.Path + " deleded"; } else { Commandbar.Content = "No file path"; } } catch { Commandbar.Content = "Error while deleting"; } }

    Gruß Klaus

    Dienstag, 20. September 2016 10:08
  • Hallo Klaus,

    Was mache ich aber wenn ich FileOpenPicker oder Folderpicker nicht verwenden will weil z.B. zwei verschiedene Anwendungen in einem gemeinsamen Ordner, der extra für diese Anwendungen angelegt ist, zugreifen möchten?

    Eigentlich geht das gar nicht auf diese Weise. Man kann sich diverse Rechte im App Manifest holen und damit dann einen gemeinsamen Ordner einrichten, aber eigentlich sollten Anwendungen über gemeinsame APIs o.ä. kommunizieren und nicht über Dateien.

    Innerhalb deiner App kannst du aber auch die Ordner aus ApplicationData nutzen, auf diese hat deine App immer schreibrechte.

    Wenn ich, wie in meinem nachstehenden Beispiel die Datei löschen will ohne dass ich mir das Storagefile aus dem vorherigen Zugriff gemerkt habe und damit file definiere?

    Wo liegt in dem Beispiel das Problem sich den StorageFile-Verweis aufzubewahren? Das Storage-System von UWP baut darauf auf nicht mehr mit Dateipfaden und Namen, sondern weitestgehend mit den Storage-Objekten zu arbeiten.

    Ansonsten cached Windows auch auf was du Zugriffsrechte hast und du musst nicht immer das StorageFile-Objekt aufbewahren. Allerdings brauchst du dann noch immer den Dateinamen weswegen das keine Vorteile bringt.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 20. September 2016 11:32
  • Hallo Tom

    Wo liegt in dem Beispiel das Problem sich den StorageFile-Verweis aufzubewahren? 

    Dies war ja nur ein Beispiel!

    Man kann sich diverse Rechte im App Manifest holen und damit dann einen gemeinsamen Ordner einrichten

    Dies wäre ja eine Möglichkeit, kannst du mir diesen Weg beschreiben?

    Innerhalb deiner App kannst du aber auch die Ordner aus ApplicationData nutzen, auf diese hat deine App immer schreibrechte.

    Auch die andere App auf den selben Ordner? Auch hier wäre ich für ein Beispiel dankbar.

    Gruß Klaus

    Dienstag, 20. September 2016 12:36
  • Hallo Klaus,

    Das ist das Problem mit Beispielen, oftmals abstrahieren sie etwas so sehr dass das eigentliche Problem ebenfalls verschwindet.

    Dies wäre ja eine Möglichkeit, kannst du mir diesen Weg beschreiben?

    App/Manifest öffnen und benötigte Dinge eintragen. Vieles lässt sich über den grafischen Editor erledigen, für manches musst du die Datei aber mit einem XML-Editor öffnen und so alles notwendige ergänzen. Was du genau zur Verfügung hast steht in der MSDN: Deklarationen der App-Funktionen

    Auch die andere App auf den selben Ordner? Auch hier wäre ich für ein Beispiel dankbar.

    Apps können aufgrund der Sandbox immer nur auf ihren eigenen Ordner zugreifen. Anders sähe es aus wenn die andere Anwendung eine klassische Win32 Anwendung mit Adminrechten ist.

    Wie ich oben schon mal schrieb ist das aber sowieso kein all zu toller weg wenn 2 Anwendungen auf die selben Dateien zugreifen. Was es für alternativen gibt hängt aber auch immer davon ab was du denn genau vor hast.

    Wenn man mal Facebook und Messenger als App betrachtet, so greifen diese beide jeweils auf den Facebook-Server zu und kommen so an die gleichen Daten heran.
    Wenn du dagegen mit dem System kommunizierst, so gibt es oftmals spezielle Klassen die du dafür nutzen kannst.
    Ich habe es nicht ausprobiert, aber ich vermute dass es kein Problem darstellt die Kontaktbilder in deinem App-Ordner abzuspeichern sodass das System diese daraus auslesen kann. Denn das System hat ja grundsätzlich auf alles Zugriff.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 20. September 2016 12:54
  • Hallo Tom,

    vielen Dank für deine Antworten. Werde mal ein wenig experimentieren. Wo mir etwas an Verständnis fehlt: Mit dem OpenPicker kann ich jeden Pfad auswählen, also auch F:\\MyFolder, und dann hier eine Datei ablegen, aber 

    var folder = await StorageFolder.GetFolderFromPathAsync("F:\\MyFolder");

    geht nicht!

    Gruß Klaus


    Dienstag, 20. September 2016 13:11
  • Hallo Klaus,

    die App hat immer nur Zugriff auf ganz wenige Ordner und das was du im Manifest angegeben hast. Wenn nun der Benutzer aber eine Datei auswählt, dann hat deine App auch zugriff darauf.
    Du kannst aus der App heraus den FileOpenPicker nicht manipulieren, daher ist das auch eine Art Sicherheits-Feature.

    Wenn du nun versuchst das StorageFolder-Objekt per Pfad abzurufen scheitert es wieder, da nur in dem StorageFolder-Objekt vom Picker das Zugriffsrecht vermerkt ist.
    Darauf verlassen, dass es scheitert, kann man sich nicht, da die Rechte teilweise gecached werden. Aber in den meisten Fällen bekommst du eine Exception.


    Tom Lambert - .NET (C#) MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Dienstag, 20. September 2016 13:27
  • Hallo Tom,

    danke für die erläuternden Hinweise.

    Gruß Klaus

    Dienstag, 20. September 2016 16:31