Android 将图片保存到本地,并实时更新图库。

本文介绍了一种在智能电视上保存远程文件并实时更新本地图库的方法。通过自定义函数saveScreenshotPictures,将Bitmap类型的截图保存为JPEG格式的图片,同时确保目录存在并创建新文件。在文件保存后,调用updateFileFromDatabase函数更新图库数据库,实现图库的实时更新。

1.需求:

需要将远程传回的文件保存到本地,并实时更新图库

 

2.代码实现:

    private void saveScreenshotPictures(Bitmap mScreenshotbitmap){
        fileName = "/storage/emulated/0/smarttv/screenshots/"+
                generateFileName()+".png";
        LogUtils.i("mScreenshotbitmap = "+mScreenshotbitmap);
        if(mScreenshotbitmap == null){
            return;
        }
        File filePic ;
        try{
            LogUtils.i("fileName = "+fileName);
            filePic = new File(fileName);
            if(!isDirExist()){
                mkStoragedir();
                filePic.createNewFile();
            } else {
                filePic.createNewFile();
            }

            FileOutputStream fos = new FileOutputStream(filePic);
            mScreenshotbitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos);
            fos.flush(); fos.close();
            //begin added by sineng.li for XR 7232788 TCT_SmartTV update pictures database after saving action on 20181220
            updateFileFromDatabase(getContext(),filePic);
            //end added by sineng.li for XR 7232788 TCT_SmartTV update pictures database after saving action on 20181220
        }catch (IOException e){
            e.printStackTrace();
        }
    }

    @NonNull
   private String generateFileName(){
        Date currentTime = new Date();
        SimpleDateFormat formatter = new SimpleDateFormat(PICTURE_NAME_FORMAT);
        String dateString = formatter.format(currentTime);
        return "TV_Screenshot_"+dateString;

    }

有很多信息涉及到公司的,就改了一些,你们自己调试一下看能不能运行。

在 Unity for Android 平台上实现将图片保存到设备本地存储,通常需要以下几个步骤:截图、保存为文件、刷新图库以确保图片能够立即显示在设备相册中。 ### 截图保存为 PNG 文件 首先,可以通过 `Texture2D` 对象截取当前屏幕画面,将其编码为 PNG 格式,然后保存到设备的存储路径中。以下是一个完整的代码示例: ```csharp using System.IO; using UnityEngine; using System.Collections; public class ScreenshotSaver : MonoBehaviour { // 调用此方法以保存截图 public void SaveScreenshot(string fileName) { StartCoroutine(UploadPNG(fileName)); } private IEnumerator UploadPNG(string fileName) { // 等待当前帧结束,确保屏幕更新 yield return new WaitForEndOfFrame(); // 获取屏幕分辨率 int width = Screen.width; int height = Screen.height; // 创建 Texture2D 用于存储屏幕截图 Texture2D tex = new Texture2D(width, height, TextureFormat.RGB24, false); tex.ReadPixels(new Rect(0, 0, width, height), 0, 0); tex.Apply(); // 将 Texture2D 编码为 PNG 字节数据 byte[] bytes = tex.EncodeToPNG(); GameObject.Destroy(tex); // 确定保存路径 string path = PathForFile(fileName); // 保存文件到本地 File.WriteAllBytes(path, bytes); // 刷新图库 RefreshMediaScanner(path); } // 根据平台确定文件路径 private string PathForFile(string fileName) { string path = ""; #if UNITY_ANDROID && !UNITY_EDITOR path = Application.persistentDataPath + "/" + fileName; #else path = Application.dataPath + "/" + fileName; #endif return path; } // 刷新 Android 图库 private void RefreshMediaScanner(string filePath) { #if UNITY_ANDROID && !UNITY_EDITOR AndroidJavaClass playerActivity = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); AndroidJavaObject activity = playerActivity.GetStatic<AndroidJavaObject>("currentActivity"); AndroidJavaClass mediaScannerConnection = new AndroidJavaClass("android.media.MediaScannerConnection"); AndroidJavaObject context = activity.Call<AndroidJavaObject>("getApplicationContext"); string[] paths = new string[] { filePath }; string[] mimeTypes = new string[] { "image/png" }; mediaScannerConnection.CallStatic("scanFile", context, paths, mimeTypes, null); #endif } } ``` ### 说明 - `UploadPNG` 方法用于截取屏幕保存为 PNG 文件。 - `PathForFile` 方法根据平台返回合适的文件路径。在 Android 上,使用的是 `Application.persistentDataPath`。 - `RefreshMediaScanner` 方法调用 Android 的 `MediaScannerConnection` 来刷新图库,使图片立即出现在相册中[^1]。 ### Android 权限 为了确保应用可以写入外部存储,必须在 `AndroidManifest.xml` 文件中添加以下权限: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 从 Android 6.0(API 23)开始,还需要在运行时请求权限。可以使用 Unity 的 `AndroidPermissions` 插件或自定义 Java 代码来处理权限请求。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值