我正在将照片保存在 android 图库上,但照片保存有延迟

Posted

技术标签:

【中文标题】我正在将照片保存在 android 图库上,但照片保存有延迟【英文标题】:I'm saving the photo on the android gallery but the photo has a delay to save 【发布时间】:2013-05-31 17:52:54 【问题描述】:

我想用我的应用拍照并将其发送到 Instagram,但我遇到了一些问题,因为当我拍摄照片时,我的应用需要延迟保存。

我的应用就是这样做的

首先我用我的应用拍照并将这张照片保存在图库中。

在用户批准或不批准图像之后。如果他同意,他会单击一个按钮并将其发送到 Instagram,但我不知道为什么该应用程序需要几秒钟来保存我的图像。

获取我想要使用的图像的方法是获取我保存在文件夹图库中的最后一张图片。

这是我用来拍照的代码。

camera = cameraSurfaceView.getCamera();
camera.takePicture(new ShutterCallback() 

    @Override
    public void onShutter() 
        AudioManager mgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        mgr.playSoundEffect(AudioManager.FLAG_PLAY_SOUND);
    
, null, new HandlePictureStorage(preview,cameraSurfaceView.getFront()));

imageSelected = false;

sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"+ Environment.getExternalStorageDirectory())));

这是我用来获取图片并保存的类

public class HandlePictureStorage implements PictureCallback 

FrameLayout preview;
int wid = 0;
Bitmap bitmapFinal;
boolean front;

File storagePath = new File(Environment.getExternalStorageDirectory() + "/Tubagram/");

public HandlePictureStorage(FrameLayout preview, boolean front)
    this.preview = preview;
    this.front = front;


@Override
public void onPictureTaken(byte[] picture, Camera camera) 

    Matrix matrix = new Matrix();

    if (front)
        matrix.postRotate(270);
    else
        matrix.postRotate(90);
    

    Bitmap cameraBitmap = BitmapFactory.decodeByteArray(picture, 0, picture.length);

    wid = cameraBitmap.getWidth();

    Bitmap scaledBitmap = Bitmap.createScaledBitmap(cameraBitmap, wid, wid, true);
    Bitmap imagemRotacionada = Bitmap.createBitmap(scaledBitmap,0,0,scaledBitmap.getWidth(),scaledBitmap.getHeight(),matrix,true);

    Bitmap newImage = Bitmap.createBitmap
            (612, 612, Bitmap.Config.ARGB_8888);

    Canvas canvas = new Canvas(newImage);

    canvas.drawBitmap(imagemRotacionada, 0f, 0f, null);

    Drawable drawable = preview.getForeground();
    drawable.setBounds(0, 0, 612, 612);
    drawable.draw(canvas);

    File myImage = new File(storagePath,"TUBAGRAM_" + System.currentTimeMillis() +".png");

    try
    
        FileOutputStream out = new FileOutputStream(myImage);
        newImage.compress(Bitmap.CompressFormat.PNG, 100, out);
        bitmapFinal = newImage;

        out.flush();
        out.close();
        Log.i("Imagem Tubagram salva em ", ""+  myImage);
    
    catch(FileNotFoundException e)
    
        Log.d("In Saving File", e + "");    
    
    catch(IOException e)
    
        Log.d("In Saving File", e + "");
    

    drawable = null;

//      newImage.recycle();
    newImage = null;

    cameraBitmap.recycle();
    cameraBitmap = null;

这是我接受照片并发送到 Instagram 时的代码

if (verificaInstagram())

    Intent shareIntent = new Intent(android.content.Intent.ACTION_SEND);
    shareIntent.setType("image/*");

    Cursor c1 = pickLastPhotoAlbum();

    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://"+Environment.getExternalStorageDirectory()+ "/Tubagram/" + c1.getString(1)+".png"));
    shareIntent.setPackage("com.instagram.android");

    c1.close();

    startActivity(shareIntent);

else
    Toast.makeText(v.getContext(), "Você não possui o Instagram no seu smartphone!", Toast.LENGTH_SHORT).show();

有人可以帮我吗?

【问题讨论】:

我们所说的延迟是多少?当您使用默认相机应用程序拍照时,您知道保存它也需要时间。我认为如果延迟不到几分钟,那么只需处理它并添加一个 ProgressDialog 以显示用户等待。 这需要几秒钟。我会尝试回过头来说这个解决方案有效。谢谢@vilpe89。 如果有人有其他方法可以解决这个问题,请告诉我 【参考方案1】:

好的。我通过这样做解决了这个问题。

我用来保存图片的类我改了这部分...

FileOutputStream out = new FileOutputStream(myImage);
newImage.compress(Bitmap.CompressFormat.PNG, 100, out);
bitmapFinal = newImage;

out.flush();

现在我用这个...

String nomeImagem = "TUBAGRAM_" + System.currentTimeMillis();
url = MediaStore.Images.Media.insertImage(preview.getContext().getContentResolver(), newImage ,nomeImagem, null);

我用来接受照片并发送到 Instagram 的代码我更改为

caminhoImagens = getRealPathFromURI(Uri.parse(hps.getUrl()));

Log.i("Caminho imagem: ", caminhoImagens);

shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + caminhoImagens));

shareIntent.setPackage("com.instagram.android");

并退出光标。

【讨论】:

以上是关于我正在将照片保存在 android 图库上,但照片保存有延迟的主要内容,如果未能解决你的问题,请参考以下文章

照片后如何更新 Android 图库?

避免图库保存在Android中使用相机拍摄的照片

Android笔记67Android之使用系统中的相机功能(拍照保存照片显示拍摄的照片照片保存到图库等操作)

Flutter:捕获照片 - 保存到图库 - 从图库中读取照片

使用 Swift 将照片保存到图库中的文件夹

Android 图库导入