如何在使用Delphi拍摄相机意图照片后从Android Gallery中删除图像

如何在使用Delphi拍摄相机意图照片后从Android Gallery中删除图像,android,delphi,android-camera,android-gallery,Android,Delphi,Android Camera,Android Gallery,如何在使用Delphi Android拍摄相机意向照片后删除画廊图像? 我的申请要求我打电话给一个意图拍照的人。照片不能在库中,但必须在特定的“我的自定义目录”中 如果您正在使用action TakePhotoFromCameraAction属性NeedSaveToAlbum:=false不起作用 这里引用了stackoverflow的一个问题: 最初用户必须使用额外的_输出,但我很快发现 以下: -有些设备会完全使用它并跳过多媒体资料。 -有些设备完全忽略它,只使用多媒体资料。 -有些设备真的

如何在使用Delphi Android拍摄相机意向照片后删除画廊图像? 我的申请要求我打电话给一个意图拍照的人。照片不能在库中,但必须在特定的“我的自定义目录”中

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

这里引用了stackoverflow的一个问题:

最初用户必须使用额外的_输出,但我很快发现 以下: -有些设备会完全使用它并跳过多媒体资料。 -有些设备完全忽略它,只使用多媒体资料。 -有些设备真的会将全尺寸的图像保存到图库中,并只将缩略图保存到我想要的位置。(你知道谁吗 你是……)

我在Java上发现的想法是:

  • 当用户按下捕获按钮时,发送意图,从image mediastore获取最后一个id并存储它

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

  • 获取新图像的路径,并将jpg文件复制(或更好地移动)到您自己的路径。如果你从CameraSharedPath中删除一个文件,图像仍然会在Android Gallery中,所以

  • 按图像ID从库中删除图像

  • 下面是我如何用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.