Android截取屏幕并新建目录保存到手机

本文介绍了一种在交易成功后自动截取界面并保存至手机的方法,提供了两种实现思路:一是通过指定控件ID截取特定区域,二是截取整个屏幕。详细解释了如何使用Bitmap和Canvas进行截图,并在Android 6.0+系统中添加了必要的权限请求。

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

产品今天提了个需求,让把每次交易成功后的界面都自动截屏保存到手机中;

查找了下资料,可以有两种思路,

第一:截取指定控件的界面,实现需要根据控件的id来截取;

第二:截取整个屏幕,实现需要获取整个窗口来截取;

先看下实现效果:

布局文件效果图:

 交易成功截取中间签购单的效果图:

交易成功截取整个屏幕效果图:

实现方法如下:

 当截取控件是View传入的是控件的id;

当截取整个屏幕时View传入的是getWindow().getDecorView();

private void saveTransImage(View v) {
    try {
        Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas();
        canvas.setBitmap(bitmap);
        v.draw(canvas);

        // 首先保存图片路径
        File appDir = new File(Environment.getExternalStorageDirectory(), "xxxx");//xxxx为手机本地生成的文件夹名//称,自定义
        if (!appDir.exists()) {
            appDir.mkdir();
        }

        //当前时间来命名图片,这样就不会覆盖之前的图片,如果此值固定就只有一张图片,以前的会被替换;
        String fileName = Device.getDateTime() + ".jpg";
        File file = new File(appDir, fileName);

        try {
            FileOutputStream fos = new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
        } catch (FileNotFoundException e) {
            throw new InvalidParameterException();
        }
        bitmap.recycle();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

布局文件(截取的签购单就是根据标出的id来截取的):

注意:

Android 6.0+系统需要在onCreate()增加读取SDcard的权限;

 /**
     * 检查相册权限
     */
    public void checkPermission() {
        if (Build.VERSION.SDK_INT >= 23) {
            List<String> permissionStrs = new ArrayList<>();
            //sd卡写入权限
            int hasWriteSdcardPermission = ContextCompat.checkSelfPermission(SaleSlipActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
            if (hasWriteSdcardPermission != PackageManager.PERMISSION_GRANTED) {
                permissionStrs.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
            }
//相机权限
//            int hasCameraPermission = ContextCompat.checkSelfPermission(
//                    SaleSlipActivity.this,
//                    Manifest.permission.CAMERA);
//            if(hasCameraPermission != PackageManager.PERMISSION_GRANTED) {
//                permissionStrs.add(Manifest.permission.CAMERA);
//            }
            String[] stringArray = permissionStrs.toArray(new String[0]);
            if (permissionStrs.size() > 0) {
                ActivityCompat.requestPermissions(this, stringArray, REQUEST_CODE_ASK_PERMISSIONS);
                return;
            }
        }
    }

    //权限设置后的回调函数,根据不同权限进行相应设置,
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            //requestPermissions传入的参数为几个权限,则permissions和grantResults为对应权限和设置结果
            case REQUEST_CODE_ASK_PERMISSIONS:
                //遍历每个权限设置情况
                if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    //需要相关权限的操作
                } else {
                    Toast.makeText(SaleSlipActivity.this, "权限未开启", Toast.LENGTH_SHORT).show();
                }
        }
        super.onRequestPermissionsResult(requestCode, permissions,
                grantResults);
    }

注:如有问题可以回复,看到第一时间分析解决,码农不易,感觉对您有用,帮助到您,可否打赏一杯可乐,在此谢过诸位,愿诸君终成大神,前程似锦~~~

 

 

 

 

### Unity 中实现 UI 界面截图保存至移动设备相册 为了实现在 Unity 中将 UI 界面截图保存到移动设备的相册,可以通过以下方法来完成: #### 方法概述 通过 `Texture2D.ReadPixels` 和 `ScreenCapture.CaptureScreenshot` 可以获取屏幕上的图像数据。对于更复杂的场景,比如只截取特定 Canvas 的内容,则需要创建一个 Render Texture 来捕捉指定区域的画面。 #### 使用 ScreenCapture.CaptureScreenshot 保存整个屏幕截图 最简单的方式是使用内置函数 `ScreenCapture.CaptureScreenshot`,这会直接调用系统的截图功能将图片保存到默认路径下[^1]。 ```csharp using UnityEngine; public class SaveScreenshot : MonoBehaviour { public void Capture() { string filename = System.DateTime.Now.ToString("yyyyMMdd_HHmmss") + ".png"; ScreenCapture.CaptureScreenshot(filename); Debug.Log($"Captured screenshot saved as {filename}"); } } ``` #### 自定义逻辑捕获特定Canvas的内容 如果希望仅保存某个特定的 UI 组件而不是整屏内容,那么就需要更加精细的操作方式: 1. 创建一个新的摄像机专门用于渲染目标 Canvas; 2. 设置此摄像机的目标纹理为目标 RenderTexture 对象; 3. 渲染完成后读取 RenderTexture 数据转换为常规格式如 PNG 或 JPEG 文件; 4. 利用第三方库或平台 API 把生成的数据流写入外部存储空间中。 下面是一个简单的例子展示如何做到这一点: ```csharp using UnityEngine; using System.IO; public class CustomCanvasCapture : MonoBehaviour { private Camera captureCamera; // 新建用来抓拍canvas的相机 public RectTransform canvasRectTransform; // 要被拍摄的Canvas RectTransform public int resolutionScale = 2; // 输出分辨率倍率,默认两倍于原生尺寸 public async void OnClickSaveToGallery(){ await Task.Yield(); // 确保当前帧已经结束 var renderTex = new RenderTexture( (int)(canvasRectTransform.rect.width * resolutionScale), (int)(canvasRectTransform.rect.height * resolutionScale), 24); GameObject camObj = new GameObject("TempCam"); captureCamera = camObj.AddComponent<Camera>(); captureCamera.targetTexture = renderTex; captureCamera.backgroundColor = Color.clear; captureCamera.clearFlags = CameraClearFlags.Depth; captureCamera.cullingMask = 1 << LayerMask.NameToLayer("UI"); // 只渲染UI层 captureCamera.transform.SetParent(canvasRectTransform, false); // 执行一次Render操作 captureCamera.Render(); // 获取像素颜色数组 RenderTexture.active = renderTex; Texture2D screenShot = new Texture2D(renderTex.width, renderTex.height, TextureFormat.RGB24, false); screenShot.ReadPixels(new Rect(0, 0, renderTex.width, renderTex.height), 0, 0); screenShot.Apply(); byte[] bytes = screenShot.EncodeToPNG(); DestroyImmediate(camObj); // 将字节数组保存到本地相册 #if UNITY_ANDROID && !UNITY_EDITOR using(AndroidJavaClass galleryPlugin = new AndroidJavaClass("com.yourpackage.SaveImage")) { galleryPlugin.CallStatic("save", "MyCustomScreenshot.png", bytes); } #elif UNITY_IOS && !UNITY_EDITOR // iOS部分省略... #endif } } ``` 注意,在实际应用时还需要考虑不同操作系统之间的差异以及权限管理等问题。特别是针对Android平台可能需要用到JNI接口或者借助插件来进行跨平台开发工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值