2017-03-25 15 views
1

デルファイアンドロイドで撮影したカメラインテント写真の後にギャラリー画像を削除するにはどうすればいいですか? 私のアプリケーションでは、写真を撮る意思を私に要求する必要があります。写真はギャラリーに入れることはできませんが、代わりに特定のカスタムディレクトリにある必要があります。デルファイで撮影したカメラインテント写真の後にAndroidギャラリーから画像を削除するには

Action TakePhotoFromCameraActionプロパティを使用している場合NeedSaveToAlbum:= falseが機能していません。ここで

stackoverflowのからの質問の1からの引用です:

もともとユーザーがEXTRA_OUTPUTを使用する必要がありますが、私はすぐに次 を発見: - 一部のデバイスは完全にそれを使用してギャラリーをスキップします。 - 一部の端末はそれを完全に無視し、ギャラリーのみを使用します。 - いくつかのデバイスは実際に吸い取ってギャラリーにフルサイズの画像を保存し、私が望む場所にのみサムネイルを保存します。私は、Javaにsolutionを見つけ

を(HTCあなたは...あなたが誰であるか 知っている)、考え方は次のとおりです。

  1. ユーザーが意図が送信されたキャプチャボタンを押すと、最後に行くと取得しますImage mediastoreからのIDを格納します。

  2. 続いたときに活動が戻る、撮影前の最​​後の画像IDのチェックは、その取得した後の画像を照会記録し、その後、より大きなID持っている -

  3. をその新しいイメージとコピー(またはそれ以上のパスを取得します。移動)jpgファイルを自分のパスにコピーします。 CameraSharedPathからファイルを削除すると、画像はまだAndroid Galleryに保存されますので、

  4. ギャラリーからIDで画像を削除してください。
+0

'フォトギャラリーにすることはできませんが、代わりにナンセンスである特定directory.'でなければなりません。ギャラリーアプリはストレージスペースではなく、あなたのデバイス上のすべてのイメージを表示するアプリです。すべての画像ファイルはディレクトリにあります。ファイルはどこにあるはずですか?あなたの問題を言い換えてください。 – greenapps

+0

Android Galleryは仮想ストレージで、AndroidのMediaScannerはSDカードのフォルダをスキャンし、ギャラリーに追加します。 Androidは通常、TPath.GetSharedCameraPathに写真を保存しますが、その場所からファイルを削除すると、まだギャラリーにあります。既に確認済みです。キャッシュされたファイルであるかどうかわかりません。 '写真はギャラリーにあることはできませんが、特定のカスタムディレクトリになければなりません。 ' – alitrun

+0

全くストレージがありません。ギャラリーアプリはまだそこにあるMediaStoreのサムネイルを使用できます。あなたは、ファイルがなくなったことをメディアストアに知らせなければなりません。または、デバイスを再起動します。 – greenapps

答えて

1

ここで私はDelphiでどのようにしたのですか。 TakePhotoFromCameraActionアクションを使用している場合は、NeedSaveToAlbumをtrueに設定することを忘れないでください。今、NeedSaveToAlbumはAndroidの問題のために動作しませんが、将来は動作します。 また、手動でネイティブのAndroidのカメラの意図を呼び出し、画像をキャプチャすることができます(Delphiでそれを行う方法 - hereを説明)

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. 
関連する問題