German ContentChooser-Pfad- und Dateiname

Kiffi

Well-Known Member
Licensed User
Longtime User
Hallo,

ich bin ein wenig verwirrt wg. folgenden Szenarios:

Ich rufe nen ContenChooser auf:
B4X:
CC.Show("image/*", "Choose image")

danach lade ich das ausgewählte Bild in ein ImageView:
B4X:
Sub CC_Result(Success As Boolean, Dir As String, FileName As String)
  If Success Then
    picBild.Bitmap = LoadBitmap(Dir, Filename)
    [...]

soweit klappt das wie erwartet.

Nun speichere ich mir den Inhalt von Dir und FileName in einer Datenbank, um das Bild zu einem späteren Zeitpunkt anzuzeigen.

Seltsamerweise bekomme ich nun beim Versuch, das Bild anzuzeigen, eine Fehlermeldung:

java.io.FileNotFoundException: /ContentDir/content:/media/external/images/media/93 (No such file or directory)

Ich habe schon im Forum recherchiert, dass das Bild gar nicht als Datei
vorliegt, sondern in einer Art Datenbank vorhanden ist; ich es mir also mit
CopyFile daraus kopieren muss. Was ich allerdings nicht verstehe ist, warum
das erste LoadImage (nach Aufruf des ContentChoosers) funktioniert. Das
müsste doch genauso fehlschlagen.

Wer klärt mich auf? ;-)

Danke & Grüße ... Kiffi
 

klaus

Expert
Licensed User
Longtime User
Um Dir eine konkrete Antwort geben zu können fehlen leder noch Informationen.
- Was für Werte bekommst Du in Dir und Filename beim esrten Laden ?
- Sind diese Wert genau gleich wenn Du sie von der Datenbank zurück holst ?
- Wie sind die Werte an die Datenbank übergeben ?
- Wie zeigst Du das Bild das zweite mal an ?

Ohne den kompletten Code oder zu mindest ein abgemagertes Projekt welches das Problem zeigt ist es leider unmöglich konkrete Hilfe zu geben.

Was Du machen kannst, ist Log Zeilen einzufügen die die verschiedenen Werte anzeigen, dann kannst Du sehen ob Alles richtig ist.
Eine andere Möglichkeit ist 'Breakpoints' einzufügen und den Programmverlauf an bestimmten Stellen Zeile nach Zeile verfolgen.

Beste Grüsse.
 

Kiffi

Well-Known Member
Licensed User
Longtime User
Hallo Klaus,

danke für Deine schnelle Antwort!

Hier mal ein wenig ausführlicher mittels Codeschnippsel und Screenshot. Von
Log-Meldungen und Debugger habe ich natürlich im vorhinein schon ausgiebig
Gebrauch gemacht. Allerdings ohne Erfolg.

Erst einmal ein Stück Code:

B4X:
'Activity module
Sub Process_Globals

   Dim SQL1 As SQL

End Sub

Sub Globals

   Dim CC As ContentChooser

   Dim Button1 As Button
   Dim Button2 As Button
   Dim ImageView1 As ImageView

End Sub

Sub Activity_Create(FirstTime As Boolean)

   If FirstTime Then

      SQL1.Initialize(File.DirInternal, "test.db", True)
      SQL1.ExecNonQuery("DROP TABLE IF EXISTS TestTable")
      SQL1.ExecNonQuery("Create Table TestTable (ID INTEGER, Dir TEXT, FileName TEXT)")
      SQL1.ExecNonQuery("Insert Into  TestTable (ID) Values (1)")

   End If

   CC.Initialize("CC") ' ContentChooser

   Button1.Initialize("Button1")
   Button1.Text = "Button1"
   Activity.AddView(Button1, 0dip, 0dip, 100%x, 60dip)

   Button2.Initialize("Button2")
   Button2.Text = "Button2"
   Activity.AddView(Button2, 0dip, 70dip, 100%x, 60dip)

   ImageView1.Initialize("ImageView1")
   Activity.AddView(ImageView1, 0dip, 150dip, 100%x, 200dip)

End Sub

Sub Button1_Click
   
   CC.Show("image/*", "Choose image")
   
End Sub

Sub CC_Result(Success As Boolean, Dir As String, FileName As String)

   If Success Then
      
      ImageView1.Bitmap = LoadBitmap(Dir, Filename)
      
      Log("CC_Result Dir: '" & Dir & "'")
      Log("CC_Result Filename: '" & Filename & "'")
      
      SQL1.ExecNonQuery("Update TestTable Set Dir = '" & Dir & "', FileName = '" & FileName & "' Where ID = 1")

   End If
   
End Sub

Sub Button2_Click

   Dim Cursor1 As Cursor
   
   Cursor1 = SQL1.ExecQuery("Select Dir, FileName From TestTable Where ID = 1")
   
   Cursor1.Position = 0
   
   Dim Dir As String
   Dim FileName As String
   
   Dir = Cursor1.GetString("Dir")
   FileName = Cursor1.GetString("FileName")
   
   Cursor1.Close
   
   Log("Button2_Click Dir: '" & Dir & "'")
   Log("Button2_Click Filename: '" & Filename & "'")

   ImageView1.Bitmap = LoadBitmap(Dir, FileName)
   
End Sub

und hier ein Screenshot, der die Log-Ausgaben anzeigt:



Mit Button1 suche ich aus der Galerie ein Bild aus und zeige es in meiner App
an. Pfad und Name der Datei speichere ich in der Datenbank. Mit Button2 lese
ich Pfad und Namen der Datei aus der Datenbank aus und versuche, das Bild
anzuzeigen. Leider rummst es dort (siehe Screenshot).

Grüße ... Kiffi

// Edit: Wie geahnt, handelt es sich bei dem zurückgegebenen Pfad um einen
virtuellen Pfad (siehe auch hier: http://goo.gl/Lo0us).
Da wird mir wohl nichts anderes übrigbleiben, als das Bild (wie von Erel vorgeschlagen)
zu kopieren. Dennoch ist es merkwürdig, dass das erste LoadBitmap nicht ebenso fehlschlägt.
 
Last edited:
Top