如何在使用德尔福拍摄相机意图照片后从Android图库中删除图像



如何使用德尔福Android拍摄相机意图照片后删除图库图像? 我的申请要求我打电话给意图拍照。照片不能在图库中,而必须位于特定的自定义目录中。

如果您正在使用操作 TakePhotoFromCameraAction 属性 NeedSaveToAlbum := false 不起作用。

以下是来自stackoverflow的一个问题的引用:

最初用户必须使用该EXTRA_OUTPUT,但我很快发现 以后: - 某些设备完全使用它并跳过图库。 - 某些设备完全忽略它,只使用图库。 - 有些设备真的很糟糕,并将全尺寸图像保存到图库,并且仅将缩略图保存到我想要的位置。(HTC你知道谁 你是...

我在 Java 上找到了解决方案,这个想法是:

  1. 当用户按下捕获按钮时,将发送意图,然后从图像媒体存储中获取最后一个id并存储它。

  2. 然后,当活动返回时,检查捕获前的最后一个图像 ID,然后在捕获后查询图像的 id 大于记录的 -

  3. 获取该新图像的路径,并将 jpg 文件复制(或更好地移动)到您自己的路径。如果您从CameraSharedPath中删除文件-图像仍将在Android图库中,因此

  4. 按 ID 从图库中删除图像。

以下是我与德尔福的做法。 如果您正在使用动作 TakePhotoFromCameraAction,请记住将 NeedSaveToAlbum 设置为 true。现在NeedSaveToAlbum无法正常工作,因为Android问题,但它将来可以工作。 您还可以手动捕获调用本机Android Camera Intent的图像(如何使用Delphi执行此操作 - 在此处描述)

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.

最新更新