Android 11+储存与相册适配

10以下的就直接保存到一个文件夹里,然后刷新相册

private fun noticeAlbumUpdate(sdPicPath: String) {
        //通知系统相册更新
        val sdPicFile = FileUtils.getFileByPath(sdPicPath)
        val contentUri = Uri.fromFile(sdPicFile)
        MediaScannerConnection.scanFile(this@FilePreviewActivity,
                arrayOf(sdPicFile.absolutePath), arrayOf("image/jpeg"),
                MediaScannerConnection.OnScanCompletedListener { path, uri -> LogUtils.i("file $path", " scanned seccessfully: $uri") })
    }

11和以上的保存相册


import android.content.ContentResolver;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.provider.MediaStore;
import android.util.Log;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;

public class SaveUtils {
    private static final String TAG = "SaveUtils";

    /**
     * 将图片保存到系统相册
     */
    public static boolean saveImgToAlbum(Context context, String imageFile) {
        Log.d(TAG, "saveImgToAlbum() imageFile = [" + imageFile + "]");
        try {
            ContentResolver localContentResolver = context.getContentResolver();
            File tempFile = new File(imageFile);
            ContentValues localContentValues = getImageContentValues(tempFile, System.currentTimeMillis());
            Uri uri = localContentResolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, localContentValues);

            copyFileAfterQ(context, localContentResolver, tempFile, uri);
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, uri));
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    /**
     * 获取图片的ContentValue
     */
    public static ContentValues getImageContentValues(File paramFile, long timestamp) {
        ContentValues localContentValues = new ContentValues();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            localContentValues.put(MediaStore.Images.Media.RELATIVE_PATH, "DCIM/Camera");
        }
        localContentValues.put(MediaStore.Images.Media.TITLE, paramFile.getName());
        localContentValues.put(MediaStore.Images.Media.DISPLAY_NAME, paramFile.getName());
        localContentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
        localContentValues.put(MediaStore.Images.Media.DATE_TAKEN, timestamp);
        localContentValues.put(MediaStore.Images.Media.DATE_MODIFIED, timestamp);
        localContentValues.put(MediaStore.Images.Media.DATE_ADDED, timestamp);
        localContentValues.put(MediaStore.Images.Media.ORIENTATION, 0);
        localContentValues.put(MediaStore.Images.Media.DATA, paramFile.getAbsolutePath());
        localContentValues.put(MediaStore.Images.Media.SIZE, paramFile.length());
        return localContentValues;
    }

    /**
     * 将视频保存到系统相册
     */
    public static boolean saveVideoToAlbum(Context context, String videoFile) {
        Log.d(TAG, "saveVideoToAlbum() videoFile = [" + videoFile + "]");
        try {
            ContentResolver localContentResolver = context.getContentResolver();
            File tempFile = new File(videoFile);
            ContentValues localContentValues = getVideoContentValues(tempFile, System.currentTimeMillis());

            Uri localUri = localContentResolver.insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, localContentValues);

            copyFileAfterQ(context, localContentResolver, tempFile, localUri);
            context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, localUri));
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    private static void copyFileAfterQ(Context context, ContentResolver localContentResolver, File tempFile, Uri localUri) throws IOException {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
                context.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R) {
            //拷贝文件到相册的uri,android11及以上得这么干,否则不会显示。可以参考ScreenMediaRecorder的save方法
            OutputStream os = localContentResolver.openOutputStream(localUri, "w");
            Files.copy(tempFile.toPath(), os);
            os.close();
            tempFile.deleteOnExit();
        }
    }


    /**
     * 获取视频的contentValue
     */
    public static ContentValues getVideoContentValues(File paramFile, long timestamp) {
        ContentValues localContentValues = new ContentValues();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            localContentValues.put(MediaStore.Video.Media.RELATIVE_PATH, "DCIM/Camera");
        }
        localContentValues.put(MediaStore.Video.Media.TITLE, paramFile.getName());
        localContentValues.put(MediaStore.Video.Media.DISPLAY_NAME, paramFile.getName());
        localContentValues.put(MediaStore.Video.Media.MIME_TYPE, "video/mp4");
        localContentValues.put(MediaStore.Video.Media.DATE_TAKEN, timestamp);
        localContentValues.put(MediaStore.Video.Media.DATE_MODIFIED, timestamp);
        localContentValues.put(MediaStore.Video.Media.DATE_ADDED, timestamp);
        localContentValues.put(MediaStore.Video.Media.DATA, paramFile.getAbsolutePath());
        localContentValues.put(MediaStore.Video.Media.SIZE, paramFile.length());
        return localContentValues;
    }



}

关于储存的适配

11使用了沙盒路径, 之前的取路径方式不推荐了

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R &&
            getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.R
        ) {
            sdPath = getExternalFilesDir(Environment.DIRECTORY_PICTURES)?.absoluteFile.toString() + "/"

        }else{
            sdPath = Environment.getExternalStorageDirectory().absolutePath + Constants.SD_PATH
        }

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Android 12 RK3588多应用录音适配是指在搭载Android 12操作系统的RK3588芯片平台上,实现多个应用程序同时进行录音的适配工作。 首先,Android 12为开发者提供了新的录音API,使得应用程序可以直接访问设备的录音功能。这些API允许应用程序获取麦克风输入并进行录音,并提供了诸如音频格式、编码器选择和文件输出等功能。在RK3588芯片平台上,开发者可以使用这些API来实现多个应用程序同时进行录音的需求。 其次,多应用录音适配需要对RK3588芯片平台的硬件进行适配。RK3588芯片平台通常搭载高性能的多核处理器和专业级音频芯片,这些硬件可以支持多个应用程序同时进行录音的需求。开发者需要确保录音API在RK3588芯片平台上的稳定性和兼容性,以保证多应用录音的正常使用。 此外,开发者还需要考虑多应用录音的隐私和安全问题。在Android 12中,录音权限被认为是一项敏感权限,需要用户明确授权才能被应用程序访问。开发者需要遵循Android 12的权限管理规则,确保用户在进行多应用录音时的隐私和安全得到有效的保障。 综上所述,Android 12 RK3588多应用录音适配需要开发者利用Android 12新的录音API,对RK3588芯片平台进行硬件适配,以及遵循权限管理规则,保障多应用录音的稳定性、兼容性、隐私和安全。这将为用户提供更好的录音体验,同时为开发者提供更大的应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值