Android 保存图片到手机相册

有一种很常见的需求,当保存图片的时候,客户需要在相册里面看到那张图片。有时候确实是保存成功了(通过IO流将图片写入了SDCard),但打开相册却看不到那张图片,需要在文件管理软件上才能找到那张图片,在网上找了许多文章,貌似都保存不到相册那里,这应该就是手机品牌的原因,有的品牌的手机能显示在相册里,有的品牌的手机却不能。解决这种问题,最简单粗暴的方法是,用那台手机拍一张照片,然后找到它,查看它的路径详情,直接根据路径用IO流写入,Android SDK 的 Build.BRAND 变量为当前手机的品牌,根据不同的品牌来做兼容处理,如果有读者用了这篇文章的代码还是不能在相册显示,可以对着这个思路来做兼容。另外值得一提的是,图片格式需要为JPEG格式才能显示在相册中,我们拍的照片也是JPEG格式的。下面用代码来实现上述的想法。

鉴于目前手机的版本普遍为Android 6.0 以上,读写外部存储文件都需要动态申请权限。这部分代码可以在当前需要读写外部存储文件的Activity中写。

String[] PERMISSIONS = {
        "android.permission.READ_EXTERNAL_STORAGE",
        "android.permission.WRITE_EXTERNAL_STORAGE" };
//检测是否有写的权限
int permission = ContextCompat.checkSelfPermission(this,
        "android.permission.WRITE_EXTERNAL_STORAGE");
if (permission != PackageManager.PERMISSION_GRANTED) {
    // 没有写的权限,去申请写的权限,会弹出对话框
    ActivityCompat.requestPermissions(this, PERMISSIONS,1);
}

保存文件的方法:
public void SaveBitmapFromView(View view) {
    int w = view.getWidth();
    int h = view.getHeight();
    Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(bmp);
    view.layout(0, 0, w, h);
    view.draw(c);
	// 缩小图片
	Matrix matrix = new Matrix();
	matrix.postScale(0.5f,0.5f); //长和宽放大缩小的比例
	bmp = Bitmap.createBitmap(bmp,0,0,               bmp.getWidth(),bmp.getHeight(),matrix,true);
	DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");  
    saveBitmap(bmp,format.format(new Date())+".JPEG");
}

/*
 * 保存文件,文件名为当前日期
 */
Public void saveBitmap(Bitmap bitmap, String bitName){
       String fileName ;
        File file ;
        if(Build.BRAND .equals("Xiaomi") ){ // 小米手机 
            fileName = Environment.getExternalStorageDirectory().getPath()+"/DCIM/Camera/"+bitName ;
        }else{  // Meizu 、Oppo
            fileName = Environment.getExternalStorageDirectory().getPath()+"/DCIM/"+bitName ;
        }
        file = new File(fileName);

        if(file.exists()){
            file.delete();
        }
        FileOutputStream out;
        try{
            out = new FileOutputStream(file);
	// 格式为 JPEG,照相机拍出的图片为JPEG格式的,PNG格式的不能显示在相册中
            if(bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out))
            {
                out.flush();
                out.close();
// 插入图库   
					             MediaStore.Images.Media.insertImage(this.getContentResolver(), file.getAbsolutePath(), bitName, null);
               
            }
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();

        }
		// 发送广播,通知刷新图库的显示
        this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + fileName)));

}

以上就是保存图片到相册的方式,代码写在Activity类中,而我们只要稍微封装一下这些代码到你的ImageUtil 或者 FileUtil那样类里面,你就可以方便地运用到你的项目中了,这里我就不封装了。

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
在UE4中保存图片Android相册,可以使用Java Native Interface(JNI)来实现。下面是具体的步骤: 1. 首先,创建一个Blueprint Function Library。在Blueprint Function Library中创建一个名为"SaveImageToGallery"的静态函数。 2. 打开Visual Studio,并将C++代码添加到BPFunctionLibrary.h和BPFunctionLibrary.cpp文件中。代码如下: // BPFunctionLibrary.h #pragma once #include "Kismet/BlueprintFunctionLibrary.h" #include "BPFunctionLibrary.generated.h" UCLASS() class YOURPROJECT_API UBPFunctionLibrary : public UBlueprintFunctionLibrary { GENERATED_BODY() public: UFUNCTION(BlueprintCallable, Category = "MyFunctions") static bool SaveImageToGallery(FString FilePath); }; // BPFunctionLibrary.cpp #include "YourProject.h" #include "BPFunctionLibrary.h" #include "Android/AndroidJNI.h" #include "Android/AndroidApplication.h" bool UBPFunctionLibrary::SaveImageToGallery(FString FilePath) { JNIEnv* Env = FAndroidApplication::GetJavaEnv(); if (Env == nullptr) { return false; } FString ClassName = FString("com/epicgames/ue4/GameActivity"); jclass ClassID = Env->FindClass(TCHAR_TO_UTF8(*ClassName)); if (ClassID == nullptr) { return false; } jmethodID MethodID = Env->GetStaticMethodID(ClassID, "SaveImageToGallery", "(Ljava/lang/String;)V"); if (MethodID == nullptr) { return false; } jstring Filename = Env->NewStringUTF(TCHAR_TO_UTF8(*FilePath)); Env->CallStaticVoidMethod(ClassID, MethodID, Filename); Env->DeleteLocalRef(Filename); return true; } 3. 在Java项目中,创建一个名为"GameActivity"的类,并在该类中添加一个名为"SaveImageToGallery"的静态方法。代码如下: package com.epicgames.ue4; import android.content.ContentValues; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Environment; import android.provider.MediaStore; import java.io.File; import java.io.FileOutputStream; public class GameActivity extends android.app.NativeActivity { static void SaveImageToGallery(String FilePath) { File ImageFile = new File(FilePath); Bitmap imageBitmap = BitmapFactory.decodeFile(ImageFile.getAbsolutePath()); ContentValues values = new ContentValues(); values.put(MediaStore.Images.Media.DATE_TAKEN, System.currentTimeMillis()); values.put(MediaStore.Images.Media.MIME_TYPE, "image/png"); values.put(MediaStore.Images.Media.ORIENTATION, 0); values.put(MediaStore.MediaColumns.DATA, ImageFile.getAbsolutePath()); ContentResolver contentResolver = this.getContentResolver(); Uri uri = contentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); try { FileOutputStream fos = contentResolver.openOutputStream(uri); if (fos != null) { imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); } } catch (Exception e) { e.printStackTrace(); } } } 4. 现在我们可以在UE4中的蓝图中调用"SaveImageToGallery"函数来保存图片Android相册了。只需传递要保存图片文件路径即可。 这样,当我们在UE4中运行该蓝图,并调用"SaveImageToGallery"函数时,图片将被保存Android相册中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值