2017-03-25 4 views
1

Wie lösche ich ein Galerie-Bild nach der Kamera Absicht Foto mit Delphi Android gemacht? Meine Anwendung erfordert, dass ich eine Absicht anrufe, ein Foto zu machen. Das Foto kann nicht in der Galerie sein, sondern muss sich in einem bestimmten benutzerdefinierten Verzeichnis befinden.So löschen Sie ein Bild aus der Android-Galerie nach der Kamera Absicht Foto mit Delphi gemacht

Wenn Sie die Aktion TakePhotoFromCameraAction Eigenschaft NeedSaveToAlbum: = false verwenden, funktioniert nicht. Hier

ist ein Zitat aus einem der Frage von Stackoverflow:

Ursprünglich Benutzer muss die EXTRA_OUTPUT verwenden, aber ich entdeckte bald die folgende: - Einige Geräte verwenden Sie es vollständig und die Galerie überspringen. - Einige Geräte ignorieren es vollständig und benutzen NUR die Galerie. - Einige Geräte saugen und speichern ein Bild in voller Größe in der Galerie und speichern ein Miniaturbild nur an dem von mir gewünschten Ort. (HTC Sie wissen, wer Sie sind ...)

I solution auf Java gefunden, die Idee ist:

  1. Wenn Benutzer Aufnahmetaste gedrückt die Absicht gesendet wird, gehen und die letzte bekommen ID aus dem Image-Mediastore und speichern Sie es.

  2. Dann, wenn die Aktivität zurückkehrt, überprüft den letzten Bild-ID vor der Aufnahme, dann Abfragen für Bilder nach der Aufnahme haben eine ID größer dann aufgezeichnet -

  3. Erhalten Sie einen Pfad der neuen Bildes und Kopie (oder besser Verschieben Sie die JPG-Datei in Ihren eigenen Pfad. Wenn Sie eine Datei aus CameraSharedPath löschen, wird das Bild weiterhin in der Android-Galerie angezeigt.

  4. Löschen Sie das Bild aus der Galerie anhand seiner ID.
+0

'Das Foto kann in der Galerie sein nicht, sondern in einem bestimmten directory.' sein muss, dass Unsinn . Die Galerie-App ist kein Speicherplatz, sondern nur eine App, die alle Bilder auf Ihrem Gerät anzeigt. Jede Bilddatei befindet sich in einem Verzeichnis. Wo sollte eine Datei anders sein? Bitte formulieren Sie Ihr Problem um. – greenapps

+0

Android Gallery ist ein virtueller Speicher, Android MediaScanner scannt Ordner auf SD-Karte und fügt sie einer Galerie hinzu. Normalerweise speichert Android Fotos in TPath.GetSharedCameraPath, aber wenn Sie eine Datei von diesem Ort löschen - sie befindet sich immer noch in einer Galerie - habe ich bereits überprüft - ich weiß nicht, ob es sich um eine zwischengespeicherte Datei handelt. Ich habe einen Satz zu 'Das Foto kann nicht in der Galerie sein, sondern muss in einem bestimmten, benutzerdefinierten Verzeichnis sein. ' – alitrun

+0

Kein Speicher. Die Galerie-App kann ein Miniaturbild aus dem MediaStore verwenden, das noch vorhanden ist. Sie müssen den Medienladen darüber informieren, dass die Datei nicht mehr verfügbar ist. Oder starte dein Gerät neu. – greenapps

Antwort

1

Hier ist, wie ich es mit Delphi gemacht habe. Wenn Sie die Aktion TakePhotoFromCameraAction verwenden, denken Sie daran, NeedSaveToAlbum auf true zu setzen. Jetzt funktioniert NeedSaveToAlbum nicht mehr, wegen Android-Problemen, aber es kann in Zukunft funktionieren. Sie können auch erfassen Bilder nativen Android-Kamera Intent Aufruf manuell (wie es mit Delphi zu tun - here beschrieben)

unit Misc.Android; 

interface 

uses 
    SysUtils, 
    Androidapi.JNI.GraphicsContentViewText, Androidapi.Helpers, Androidapi.JNI.JavaTypes, 
    Androidapi.JNIBridge, Androidapi.JNI.Provider; 

type 
    TGallery = class 
    public 
    class function GetLastImageID: integer; 
    class function GetNextImageIDFromID(aFromID: integer; out aImagePath: string): integer; 
    class function DeleteImageByID(aID: integer): boolean; 
    end; 


implementation 

const 
    _ID = '_id'; // TJBaseColumns.JavaClass._ID // uri in Androidapi.JNI.Provider 

{ TGallery } 

{If you're using action TakePhotoFromCameraAction remember to set NeedSaveToAlbum to true. 
It does not work, because of Android problems, but it can work in future.} 

class function TGallery.GetLastImageID: integer; 
var 
    vContent: JContentResolver; 
    vValues: TJavaObjectArray<JString>; 
    vOrderBy: JString; 
    vCursor: JCursor; 
begin 
    Result := -1; 
    vContent := TAndroidHelper.Activity.getContentResolver; 

    vValues := TJavaObjectArray<JString>.Create(1); 
    vValues[0] := TJBaseColumns.JavaClass._ID; 

    vOrderBy := StringToJString(_ID + ' DESC'); 

    vCursor := vContent.query(TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI, 
     vValues, nil, nil, vOrderBy); 
    try 
    if vCursor.moveToFirst then 
     Result := vCursor.getInt(vCursor.getColumnIndex(TJBaseColumns.JavaClass._ID)); 
    finally 
    vCursor.close; 
    end 
end; 

// Result is next Image ID and its aImagePath - is path to jpg image 
class function TGallery.GetNextImageIDFromID(aFromID: integer; out aImagePath: string): integer; 
var 
    vContent: JContentResolver; 
    vValues: TJavaObjectArray<JString>; 
    vFilter: JString; 
    vOrderBy: JString; 
    vArgs : TJavaObjectArray<JString>; 
    vCursor: JCursor; 
begin 
    Result := -1; 
    aImagePath := ''; 
    vContent := TAndroidHelper.Activity.getContentResolver; 
    vValues := TJavaObjectArray<JString>.Create(2); 
    vValues[0] := TJMediaStore_MediaColumns.JavaClass.DATA; 
    vValues[1] := TJBaseColumns.JavaClass._ID; 
    // vValues[1] := TJMediaStore_MediaColumns.JavaClass.SIZE; 
    // vValues[1] := TJImages_ImageColumns.JavaClass.DATE_TAKEN; 

    vOrderBy := StringToJString(_ID + ' DESC'); 
    vFilter := StringToJString(_ID + '>?'); 
    vArgs := TJavaObjectArray<JString>.Create(1); 
    vArgs[0] := StringToJString(aFromID.ToString); 

    vCursor := vContent.query(TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI, 
    vValues, vFilter, vArgs, vOrderBy); 
    try 
    if (vCursor.getCount > 0) and vCursor.moveToFirst then 
    begin 
     Result := vCursor.getInt(vCursor.getColumnIndex(TJBaseColumns.JavaClass._ID)); 
     // vCursor.getLong(imageCursor.getColumnIndex(MediaStore.Images.Media.DATE_TAKEN)); 
     //vSize := wCursor.getLong(wCursor.getColumnIndex(TJMediaStore_MediaColumns.JavaClass.SIZE)); 
     aImagePath := JStringToString(vCursor.getString(
      vCursor.getColumnIndex(TJMediaStore_MediaColumns.JavaClass.DATA))); 
    end; 
    finally 
    vCursor.close; 
    end; 
end; 

class function TGallery.DeleteImageByID(aID: integer): boolean; 
var 
    vContent: JContentResolver; 
begin 
    vContent := TAndroidHelper.Activity.getContentResolver; 
    Result := vContent.delete(TJImages_Media.JavaClass.EXTERNAL_CONTENT_URI, 
     StringToJString(_ID + '=' + aID.ToString), nil) = 1; 
end; 

end. 
Verwandte Themen