Android—将Bitmap图片保存到SD卡目录下或者指定目录

本文详细介绍了如何在Android设备的SD卡上保存Bitmap图片,并提供了代码示例,包括直接保存到SD卡和保存到指定目录下两种方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码就不废话啦

:保存到SD卡下

		File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis()+".jpg");
			try {
					out = new FileOutputStream(file);
					btImage.compress(Bitmap.CompressFormat.JPEG, 90, out);
					System.out.println("___________保存的__sd___下_______________________");
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				}
				try {
					out.flush();
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				Toast.makeText(HahItemActivity.this,"保存已经至"+Environment.getExternalStorageDirectory()+"下", Toast.LENGTH_SHORT).show();
			 }
上面的方法就是 直接定义一个文件的路径,和图片的名称,然后保存.

:保存Bitmap到指定的SD卡文件夹目录下

想想也知道,这个必须先有个文件夹,才能把图片保存这里面,那就按照思路学代码吧

 if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) // 判断是否可以对SDcard进行操作
				 {	  // 获取SDCard指定目录下
					 String  sdCardDir = Environment.getExternalStorageDirectory()+ "/CoolImage/";
					 File dirFile  = new File(sdCardDir);  //目录转化成文件夹
					 if (!dirFile .exists()) {				//如果不存在,那就建立这个文件夹
						dirFile .mkdirs();
						 }							//文件夹有啦,就可以保存图片啦			
					 File file = new File(sdCardDir, System.currentTimeMillis()+".jpg");// 在SDcard的目录下创建图片文,以当前时间为其命名
		
				try {
					out = new FileOutputStream(file);
					btImage.compress(Bitmap.CompressFormat.JPEG, 90, out);
					System.out.println("_________保存到____sd______指定目录文件夹下____________________");
				} catch (FileNotFoundException e) {
					e.printStackTrace();
				}
				try {
					out.flush();
					out.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				Toast.makeText(HahItemActivity.this,"保存已经至"+Environment.getExternalStorageDirectory()+"/CoolImage/"+"目录文件夹下", Toast.LENGTH_SHORT).show();
			 }

注:访问权限注意哦

   <!-- 安卓读写sd权限 -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
	<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/> 


关于图片的  SD卡的 
未完   待续

 //将Bitmap图片保存到sd卡

    protected void saveBitmapToSD(Bitmap bt) {
        File path = Environment.getExternalStorageDirectory();
        File file = new File(path, System.currentTimeMillis() + ".jpg");
        System.out.println(Environment.getExternalStorageState() + "/Cool/" +"000000000000000000000000000");
        try {
            FileOutputStream  out = new FileOutputStream(file);
            bt.compress(Bitmap.CompressFormat.JPEG, 90, out);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        out.flush();
        out.close();
    }

    /**
     * 保存bitmap到SD卡
     * @param bitName 保存的名字
     * @param mBitmap 图片对像
     * return 生成压缩图片后的图片路径
     */
    public static String saveMyBitmap(String bitName,Bitmap mBitmap) {
        File f = new File("/sdcard/" + bitName + ".png");
        try {
            f.createNewFile();
        } catch (IOException e) {
            System.out.println("在保存图片时出错:" + e.toString());
        }
        FileOutputStream fOut = null;
        try {
            fOut = new FileOutputStream(f);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        try {
            mBitmap.compress(Bitmap.CompressFormat.PNG, 100, fOut);
        } catch (Exception e) {
            return "create_bitmap_error";
        }
        try {
            fOut.flush();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            fOut.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "/sdcard/" + bitName + ".png";
    }

    /**
     * 保存bitmap到SD卡
     * @param bitmap
     * @param imagename
     */
    public static String saveBitmapToSDCard(Bitmap bitmap, String imagename) {
        String path = "/sdcard/" + "img-" + imagename + ".jpg";
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(path);
            if (fos != null) {
                bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
                fos.close();
            }

            return path;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }  


<think>好的,我现在需要帮助用户在Android 11及以上版本中使用Kotlin将Bitmap保存SD目录。首先,用户的问题涉及到Android 11的存储权限变化,特别是Scoped Storage,所以我要确保解决方案符合这些限制。 首先,用户需要保存图片SD,这可能需要使用MediaStore API或者访问公共目录。在Android 10及以上,应用不能直接通过文件路径访问外部存储,必须使用ContentResolver和MediaStore。因此,我应该建议用户使用MediaStore来保存图片到公共的Pictures目录或者Downloads目录。 接下来,权限方面,用户可能需要声明MANAGE_EXTERNAL_STORAGE权限,但Google Play对这项权限的使用有严格限制,通常只允许文件管理器类应用使用。所以更合适的做法可能是使用MediaStore创建文件,并请求WRITE_EXTERNAL_STORAGE权限,不过从Android 11开始,作用域存储使得应用在访问自己创建的文件时不需要这个权限。但为了兼容性,可能需要还是声明该权限,或者检查是否需要。 然后,用户需要在AndroidManifest.xml中添加适当的权限。根据引用[1],用户可能需要添加SYSTEM_ALERT_WINDOW权限,但这里主要需要的是写入外部存储的权限。不过根据Android 11的变化,可能需要在manifest中添加<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />,但可能还需要处理分区存储。 接下来,代码部分需要使用ContentResolver插入一条MediaStore记录,获取OutputStream,然后将Bitmap压缩写入。例如,使用contentResolver.insert设置MediaStore.Images.Media.EXTERNAL_CONTENT_URI,并指定DISPLAY_NAME和MIME_TYPE,然后打开OutputStream写入Bitmap数据。 另外,用户可能需要处理Android 11中的所有文件访问权限,即MANAGE_EXTERNAL_STORAGE,但应避免使用这个权限,除非必要。因此,应尽量使用MediaStore API来保存到公共目录。 可能的步骤包括: 1. 在AndroidManifest.xml中添加必要的权限,如WRITE_EXTERNAL_STORAGE,但注意Android 11后可能不需要,但需要处理Scoped Storage。 2. 使用MediaStore API插入一条新的图片记录,获取Uri。 3. 使用contentResolver.openOutputStream(uri)来获取输出流。 4. 将Bitmap压缩为JPEG或PNG格式,写入输出流。 5. 处理可能发生的异常,如IOException。 6. 可能需要请求存储权限,尽管在Scoped Storage下,如果保存到MediaStore的公共目录,可能不需要运行时权限,但需要确认。 此外,用户可能需要将图片保存到应用的私有目录,但用户需求是SD,所以公共目录更合适。例如,保存到Pictures目录。 可能还需要处理Android版本差异,使用环境变量判断版本,但主要针对Android 11及以上,所以直接使用Scoped Storage的方法。 检查引用中的代码,比如引用[2]中的Intent示例,可能与相机相关,但用户的问题是关于保存Bitmap,所以可能不直接相关。引用[1]中的sharedUserId可能涉及系统应用,但用户可能只是普通应用,所以不需要那个。 最后,代码示例应该用Kotlin编写,使用Context的contentResolver,可能还需要使用Coroutine或后台线程处理IO操作,避免主线程阻塞。 总结步骤: - 插入MediaStore记录,指定目录和文件名、MIME类型。 - 获取OutputStream并保存Bitmap。 - 处理权限和异常。</think>在Android 11及以上版本中,由于Scoped Storage的限制,保存文件到SD需通过MediaStore API实现。以下是使用Kotlin保存Bitmap到公共目录的完整方案: ### 步骤1:添加权限 在`AndroidManifest.xml`中添加: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/> <!-- 仅对Android 9及以下需要 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="30"/> ``` ### 步骤2:实现保存逻辑 ```kotlin fun saveBitmapToGallery(context: Context, bitmap: Bitmap, filename: String): Boolean { val contentValues = ContentValues().apply { put(MediaStore.Images.Media.DISPLAY_NAME, "$filename.jpg") put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg") put(MediaStore.Images.Media.RELATIVE_PATH, Environment.DIRECTORY_PICTURES) } val resolver = context.contentResolver var uri: Uri? = null var outputStream: OutputStream? = null try { uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues) uri?.let { outputStream = resolver.openOutputStream(it) outputStream?.use { stream -> if (!bitmap.compress(Bitmap.CompressFormat.JPEG, 90, stream)) { return false } } return true } } catch (e: IOException) { e.printStackTrace() uri?.let { resolver.delete(it, null, null) } } finally { outputStream?.close() } return false } ``` ### 步骤3:适配Android 11+ 1. **不需要运行时权限**:当使用`MediaStore`保存到公共目录时,Android 10+不再需要`WRITE_EXTERNAL_STORAGE`权限[^1] 2. **文件访问限制**:无法直接访问其他应用的私有目录 3. **兼容旧版本**:通过`android:requestLegacyExternalStorage="true"`属性兼容Android 10设备(在manifest的`<application>`标签内添加) ### 最佳实践 - 使用`Environment.DIRECTORY_PICTURES`保证文件归类正确 - 添加时间戳保证文件名唯一:`"IMG_${System.currentTimeMillis()}"` - 通过`ContentResolver.notifyChange`通知系统刷新媒体库 ```kotlin uri?.let { resolver.notifyChange(it, null) } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值