如何在使用Delphi拍摄相机意图照片后从Android Gallery中删除图像
如何在使用Delphi Android拍摄相机意向照片后删除画廊图像? 我的申请要求我打电话给一个意图拍照的人。照片不能在库中,但必须在特定的“我的自定义目录”中 如果您正在使用action TakePhotoFromCameraAction属性NeedSaveToAlbum:=false不起作用 这里引用了stackoverflow的一个问题: 最初用户必须使用额外的_输出,但我很快发现 以下: -有些设备会完全使用它并跳过多媒体资料。 -有些设备完全忽略它,只使用多媒体资料。 -有些设备真的会将全尺寸的图像保存到图库中,并只将缩略图保存到我想要的位置。(你知道谁吗 你是……) 我在Java上发现的想法是:如何在使用Delphi拍摄相机意图照片后从Android Gallery中删除图像,android,delphi,android-camera,android-gallery,Android,Delphi,Android Camera,Android Gallery,如何在使用Delphi Android拍摄相机意向照片后删除画廊图像? 我的申请要求我打电话给一个意图拍照的人。照片不能在库中,但必须在特定的“我的自定义目录”中 如果您正在使用action TakePhotoFromCameraAction属性NeedSaveToAlbum:=false不起作用 这里引用了stackoverflow的一个问题: 最初用户必须使用额外的_输出,但我很快发现 以下: -有些设备会完全使用它并跳过多媒体资料。 -有些设备完全忽略它,只使用多媒体资料。 -有些设备真的
下面是我如何用Delphi完成的。 如果您正在使用action TakePhotoFromCameraAction,请记住将NeedSaveToAlbum设置为true。由于安卓系统的问题,NeedSaveToAlbum现在无法工作,但它在将来可以工作。 您还可以通过手动调用本机Android Camera Intent来捕获图像(如何使用Delphi进行描述)
unitmisc.Android;
接口
使用
SysUtils,
Androidapi.JNI.GraphicsContentViewText、Androidapi.Helpers、Androidapi.JNI.JavaTypes、,
Androidapi.JNIBridge,Androidapi.JNI.Provider;
类型
TGallery=类
公众的
类函数GetLastImageID:integer;
类函数GetNextImageIDFromID(aFromID:integer;out-aImagePath:string):integer;
类函数deleteMageById(aID:integer):布尔;
结束;
实施
常数
_ID=“_ID”;//TJBaseColumns.JavaClass.\u ID//Androidapi.JNI.Provider中的uri
{TGallery}
{如果您正在使用action TakePhotoFromCameraAction,请记住将NeedSaveToAlbum设置为true。
由于安卓系统的问题,它不起作用,但在将来它可以起作用。}
类函数TGallery.GetLastImageID:integer;
变量
vContent:JContentResolver;
v值:TJavaObjectArray;
vOrderBy:JString;
vCursor:JCursor;
开始
结果:=-1;
vContent:=TAndroidHelper.Activity.getContentResolver;
v值:=TJavaObjectArray.Create(1);
v值[0]:=TJBaseColumns.JavaClass.\u ID;
vOrderBy:=StringToJString(_ID+'DESC');
vCursor:=vContent.query(TJImages\u Media.JavaClass.EXTERNAL\u CONTENT\u URI,
v值,nil,nil,vOrderBy);
尝试
如果vCursor.moveToFirst,则
结果:=vCursor.getInt(vCursor.getColumnIndex(TJBaseColumns.JavaClass._ID));
最后
vCursor.close;
结束
结束;
//结果是下一个图像ID和它的aImagePath-是jpg图像的路径
类函数TGallery.GetNextImageIDFromID(aFromID:integer;out-aImagePath:string):整数;
变量
vContent:JContentResolver;
v值:TJavaObjectArray;
vFilter:JString;
vOrderBy:JString;
vArgs:TJavaObjectArray;
vCursor:JCursor;
开始
结果:=-1;
目标路径:='';
vContent:=TAndroidHelper.Activity.getContentResolver;
v值:=TJavaObjectArray.Create(2);
v值[0]:=TJMediaStore_MediaColumns.JavaClass.DATA;
vValues[1]:=TJBaseColumns.JavaClass.\u ID;
//v值[1]:=TJMediaStore_MediaColumns.JavaClass.SIZE;
//v值[1]:=TJImages\u ImageColumns.JavaClass.DATE\u;
vOrderBy:=StringToJString(_ID+'DESC');
vFilter:=StringToJString(_ID+'>?');
vArgs:=TJavaObjectArray.Create(1);
vArgs[0]:=StringToJString(aFromID.ToString);
vCursor:=vContent.query(TJImages\u Media.JavaClass.EXTERNAL\u CONTENT\u URI,
Vvalue、vFilter、vArgs、vOrderBy);
尝试
如果(vCursor.getCount>0)和vCursor.moveToFirst,则
开始
结果:=vCursor.getInt(vCursor.getColumnIndex(TJBaseColumns.JavaClass._ID));
//getLong(imageCursor.getColumnIndex(MediaStore.Images.Media.DATE_take));
//vSize:=wCursor.getLong(wCursor.getColumnIndex(TJMediaStore_MediaColumns.JavaClass.SIZE));
aImagePath:=JStringToString(vCursor.getString(
getColumnIndex(TJMediaStore_MediaColumns.JavaClass.DATA));
结束;
最后
vCursor.close;
结束;
结束;
类函数TGallery.DeleteImageByID(辅助:整数):布尔;
变量
vContent:JContentResolver;
开始
vContent:=TAndroidHelper.Activity.getContentResolver;
结果:=vContent.delete(TJImages\u Media.JavaClass.EXTERNAL\u CONTENT\u URI,
StringToJString(_ID+'='+aID.ToString),nil)=1;
结束;
结束。
照片不能在图库中,但必须在特定目录中。
这是胡说八道。Gallery应用程序不是存储空间,只是一个显示设备上所有图像的应用程序。每个图像文件都将位于一个目录中。文件应该放在哪里?请重新表述您的问题。Android Gallery是一个虚拟存储,Android的MediaScanner扫描SD卡上的文件夹,并将它们添加到Gallery中。Android通常将照片保存在TPath.GetSharedCameraPath中,但如果您从该位置删除文件-它仍然在图库中-我已经检查过了-我不知道它可能是缓存文件。我将短语改为照片不能在图库中,但必须在特定的“我的自定义目录”中。
完全没有存储空间。Gallery应用程序可以使用MediaStore中仍然存在的缩略图。您必须通知媒体商店该文件已丢失。或者重新启动设备。
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.