【问题标题】:Can't delete a media file on android phone with AIR无法使用 AIR 删除 Android 手机上的媒体文件
【发布时间】:2023-03-18 09:47:02
【问题描述】:

[检查下半部分的最后一次编辑以获取有关主要问题的更新]

我的手机将照片存储在 SD 卡上。我用CameraUI拍照,然后想分析删除。

代码(简化):

private function startCapture():void
{
    _camera = new CameraUI();
    _camera.addEventListener( MediaEvent.COMPLETE, onCapture );

    _camera.launch(MediaType.IMAGE); //works fine
}


private function onCapture(e:MediaEvent):void
{
    var loader:Loader = new Loader();

    _filePromise = e.data;
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onAsyncMediaComplete);
    loader.loadFilePromise(m__filePromise);
}


private function onAsyncMediaComplete(e:Event):void
{
    var loader:Loader = (e.currentTarget as LoaderInfo).loader; 
    //here the loader contains the picture as expected

    //FIXME adds an empty picture instead of deleting
    _filePromise.file.deleteFile();
}

我希望 SD 卡上的图片会被删除,但它仍然存在并且在它旁边创建了一个新的虚拟文件。 我跟踪了文件的 URL 并得到了storage/sdcard0/DCIM/Camera/IMG_20131016_204700.jpg

我的 android manifest 包括

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

编辑:

正如在this article 上看到的,AIR 创建了两张图片,一张在DCIM/Camera 中,一张在DCIM/100MEDIA 中。按照建议,我扫描了 DCIM 的子文件夹中具有相同时间戳(+- 3 秒)和与event.data.file 相同大小的图片。然后删除这两张图片。代码如下:

var date:Date = m__filePromise.file.modificationDate;
var size:Number = m__filePromise.file.size;
trace("looking for", date.time, size);
var cameraFolder:File = m__filePromise.file.parent.parent;
var pictureFolders:/*File*/Array = cameraFolder.getDirectoryListing();
var pictures:/*File*/Array;
for each(var folder:File in pictureFolders)
{
    pictures = folder.getDirectoryListing();
    for each(var pic:File in pictures)
    {
        if (pic.size == size &&
            Math.abs(pic.modificationDate.time - date.time) < 3000)
        {
            //approximatively the same date, same size, let's delete the copy
            trace("delete", pic.modificationDate.time, pic.size, pic.name);
            pic.deleteFile();
        }
    }
}

问题是deleteFile 不起作用,它会留下一个同名的空文件 (0b)。我已经阅读了它的缓存问题,我发现的唯一解决方法是针对本机代码。

【问题讨论】:

  • 做的时候有没有报错?如果您尝试删除的文件不直接位于沙盒文件夹下,我假设这是 adobe air 方面的沙盒违规。即使有清单权限,它也可能不起作用。
  • 不,完全没有错误。有没有办法修改沙盒文件夹?哦,我想出了一些东西并编辑了我的问题。
  • 您是否正在收听完整事件以删除文件?通常在捕获处理程序中,您可以获得被捕获文件的文件引用(e.data as MediaPromise).file 并通过在文件本身上调用 deleteFile() 来删除该文件。 help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/…
  • 这正是我的代码所做的。

标签: android actionscript-3 air


【解决方案1】:

是的,一般来说,这是 Android 上媒体文件的缓存问题。您必须找到一种方法来启动 Intent.ACTION_MEDIA_MOUNTED 或其他方式来刷新设备的 MediaStore(可能是本机扩展)

另一种解决方案是使用 Camera 类并直接在您的应用中拍照。这是一种直接在应用中拍照的极简方式

    private var _video : Video;
    private var _cameraImage : Bitmap;
    private var _camera : Camera;

    /**
     * initilize camera
     */
    private function initCamera() : void {

        //get camera
        _camera = getCamera(CameraPosition.FRONT);
        _camera.setMode(_streamW, _streamH, streamFPS, true);
        _camera.setQuality(0, 100);
        _camPosition = CameraPosition.FRONT;

         //camera preview
        _video = new Video(_streamW, _streamH);
        _video.attachCamera(_camera);


        //rotate        
        var m : Matrix = new Matrix();
        m.rotate(Math.PI / 2);
        m.translate(_video.height, 0);
        this._video.transform.matrix = m;
        addChild(_video);
    }

    /**
     * takes photo and saves to bitmap
     */
    private function onTakePhoto(event : GestureEvent) : void {     
        var cameraBitmap : BitmapData = new BitmapData(_streamH, _streamW, true, 0x0);
        cameraBitmap.draw(_video, _video.transform.matrix);
        _cameraImage = new Bitmap(cameraBitmap);
    }

    /**
     * finds camera in desired position
     */
    private function getCamera(position : String) : Camera {
        for (var i : uint = 0; i < Camera.names.length; ++i) {
            var cam : Camera = Camera.getCamera(String(i));
            if (cam.position == position) return cam;
        }
        return Camera.getCamera();
    }

如果您直接在您的应用中拍摄照片,您将失去本机照片应用的许多功能,但在处理和保存图像时可以完全控制,并且还可以为您的应用提供特定的自定义界面。你也可以试试这个原生扩展http://distriqt.com/native-extensions#camera,它可以让你直接在应用程序中使用相机的一些更高级的功能。

【讨论】:

  • 使用 Camera 类是我考虑过的替代方案,但我讨厌它,因为我希望我的屏幕方向保持自动。纠正我,但您的 m.rotate(Math.PI / 2) 仅适用于纵向模式,并且视频预览将被旋转。我对 Native Extension 不太满意,如果您能指出一种简单的方法来实现您所说的内容,我可能会验证您的答案。
  • 旋转是在我的情况下将相机预览旋转到横向模式。因此,您可能可以通过侦听旋转事件然后更改相机分辨率的设置并在横向模式下旋转视频预览来实现自动旋转。但我知道您更喜欢 CameraUI 解决方案。创建本机扩展程序,尤其是设置环境和构建需要一些工作,但您的优势在于您只需要一个平台,这是一个非常好的tutorial here
  • 只是为了记录我对相机类的仇恨,它停用了自动对焦。您必须不时地重新创建对象以使焦点适应(并且它会关闭/重新打开快门,这对相机来说可能不是很好)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
相关资源
最近更新 更多