Here is how I did it with Delphi.
If you're using action TakePhotoFromCameraAction remember to set NeedSaveToAlbum to true. Now NeedSaveToAlbum does not work, because of Android problems, but it can work in future.
You also can capture images calling native Android Camera Intent manually (how to do it with Delphi - described 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.