国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Android13適配所有文件管理權限

這篇具有很好參考價值的文章主要介紹了Android13適配所有文件管理權限。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Android13適配所有文件管理權限

前言:

很早之前在Android11上面就適配過所有文件管理權限,這次是海外版升級到Android13,由于選擇相冊用的是第三方庫,組內(nèi)的同事沒有上架Google的經(jīng)驗直接就提交代碼,雖然功能沒有問題,但是上架的時候被打回了,于是記錄一下適配工作.

1.簡介:

絕大多數(shù)需要共享存儲空間訪問權限的應用都可以遵循共享媒體文件和共享非媒體文件方面的最佳做法。然而,某些應用的核心用例需要廣泛訪問設備上的文件,但無法采用注重隱私保護的存儲最佳實踐高效地訪問這些文件。對于這些情況,Android 提供了一種名為“所有文件訪問權”的特殊應用訪問權限。

例如,防病毒應用的主要用例可能需要定期掃描不同目錄中的許多文件。如果此掃描需要反復的用戶交互,讓其使用系統(tǒng)文件選擇器選擇目錄,就會帶來糟糕的用戶體驗。其他用例(如文件管理器應用、備份和恢復應用以及文檔管理應用)也需要考慮類似情況。

2.Google Play通知:

此部分為在 Google Play 上發(fā)布應用的開發(fā)者提供通知。

為了限制對共享存儲的廣泛訪問,Google Play 商店已更新其政策,用來評估以 Android 11(API 級別 30)或更高版本為目標平臺且通過 MANAGE_EXTERNAL_STORAGE 權限請求“所有文件訪問權”的應用。此政策自 2021 年 5 月起生效。

當應用以 Android 11 或更高版本為目標平臺并聲明了 MANAGE_EXTERNAL_STORAGE 權限時,Android Studio 會顯示圖 1 中所示的 lint 警告。此警告會提醒您:“Google Play 商店的一項政策限制了對該權限的使用”。
allfilemanagerdemo,Android版本適配,android

圖 1. Android Studio 中的 Lint 警告,提醒開發(fā)者有關 MANAGE_EXTERNAL_STORAGE 權限的 Google Play 政策。

僅當您的應用無法有效利用更有利于保護隱私的 API(如存儲訪問框架或 Media Store API)時,您才能請求 MANAGE_EXTERNAL_STORAGE 權限。您的應用對該權限的使用必須在允許的使用情形范圍內(nèi),并且必須與應用的核心功能直接相關。如果您的應用包含與以下任一項類似的用例,可能會請求 MANAGE_EXTERNAL_STORAGE 權限:

  • 文件管理器
  • 備份和恢復應用
  • 防病毒應用
  • 文檔管理應用
  • 設備上的文件搜索
  • 磁盤和文件加密
  • 設備到設備數(shù)據(jù)遷移

3.選擇相冊圖片:

由于使用的是io.github.lucksiege:pictureselector這個庫,版本為v3.10.9:

PictureSelector.create(this)
    .openGallery(SelectMimeType.ofImage())
    .setImageEngine(GlideEngine.createGlideEngine())
    .forResult(object : OnResultCallbackListener<LocalMedia?> {
        override fun onResult(result: ArrayList<LocalMedia?>) {
            LogUtils.d("===返回的圖片地址為===", result[0]!!.path)
            Glide.with(this@MainActivity).load(result[0]?.path).into(ivBg)
        }

        override fun onCancel() {}
    })

4.使用系統(tǒng)拍照:

PictureSelector.create(this)
    .openCamera(SelectMimeType.ofImage())
    .forResult(object : OnResultCallbackListener<LocalMedia?> {
        override fun onResult(result: ArrayList<LocalMedia?>) {
            LogUtils.d("===返回的圖片地址為===", result[0]!!.path)
            Glide.with(this@MainActivity).load(result[0]?.path).into(ivCamera)
        }

        override fun onCancel() {}
    })

5.打開系統(tǒng)相冊:

    private fun openPhotoAlbum() {
        val intent = Intent(Intent.ACTION_GET_CONTENT)
        intent.addCategory(Intent.CATEGORY_OPENABLE)
        intent.type = "image/*"
        //1.以startActivityForResult方式打開Activity
/*        startActivityForResult(
            Intent.createChooser(intent, "File Browser"), Constants.FILE_CHOOSER_RESULT_CODE)*/
        //2.以launch方式打開相冊
        photoLaunch.launch("image/*")
    }

6.未適配前的效果如下:

allfilemanagerdemo,Android版本適配,android

7.去掉本項目的所有文件管理權限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    tools:ignore="ScopedStorage" android:maxSdkVersion="32"/>

allfilemanagerdemo,Android版本適配,android

8.去掉后權限后再次運行:

allfilemanagerdemo,Android版本適配,android

還是提示申請所有文件管理權限,去github查看圖片庫的版本,發(fā)現(xiàn)新版本已經(jīng)適配了Android13和所有文件管理權限,于是更新一下圖片庫的依賴版本.

dependencies {
    implementation("androidx.core:core-ktx:1.9.0")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.8.0")
    implementation("androidx.constraintlayout:constraintlayout:2.1.4")
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.5")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1")
    implementation("io.github.lucksiege:pictureselector:v3.11.1")
    implementation("com.github.bumptech.glide:glide:4.15.1")
    annotationProcessor("com.github.bumptech.glide:compiler:4.15.1")
    implementation("com.blankj:utilcodex:1.31.1")
}

9.新版本ImageEngine:

/**
 * 加載圖片
 *
 * @param context   上下文
 * @param url       資源url
 * @param imageView 圖片承載控件
 */
@Override
public void loadImage(Context context, String url, ImageView imageView) {
    if (!ActivityCompatHelper.assertValidRequest(context)) {
        return;
    }
    Glide.with(context)
            .load(url)
            .into(imageView);
}

@Override
public void loadImageBitmap(@NonNull Context context, @NonNull String url, int maxWidth, int maxHeight, OnCallbackListener<Bitmap> call) {

}

/**
 * 加載相冊目錄封面
 *
 * @param context   上下文
 * @param url       圖片路徑
 * @param imageView 承載圖片ImageView
 */
@Override
public void loadAlbumCover(Context context, String url, ImageView imageView) {
    if (!ActivityCompatHelper.assertValidRequest(context)) {
        return;
    }
    Glide.with(context)
            .asBitmap()
            .load(url)
            .override(180, 180)
            .sizeMultiplier(0.5f)
            .transform(new CenterCrop(), new RoundedCorners(8))
            .placeholder(R.drawable.ps_image_placeholder)
            .into(imageView);
}


/**
 * 加載圖片列表圖片
 *
 * @param context   上下文
 * @param url       圖片路徑
 * @param imageView 承載圖片ImageView
 */
@Override
public void loadGridImage(Context context, String url, ImageView imageView) {
    if (!ActivityCompatHelper.assertValidRequest(context)) {
        return;
    }
    Glide.with(context)
            .load(url)
            .override(200, 200)
            .centerCrop()
            .placeholder(R.drawable.ps_image_placeholder)
            .into(imageView);
}

@Override
public void pauseRequests(Context context) {
    if (!ActivityCompatHelper.assertValidRequest(context)) {
        return;
    }
    Glide.with(context).pauseRequests();
}

@Override
public void resumeRequests(Context context) {
    if (!ActivityCompatHelper.assertValidRequest(context)) {
        return;
    }
    Glide.with(context).resumeRequests();
}

private MyImageGlideEngine() {
}

private static final class InstanceHolder {
    static final MyImageGlideEngine instance = new MyImageGlideEngine();
}

public static MyImageGlideEngine createGlideEngine() {
    return InstanceHolder.instance;
}

allfilemanagerdemo,Android版本適配,android

?

package com.example.allfilemanagerdemo.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.widget.ImageView;

import androidx.annotation.NonNull;

import com.bumptech.glide.Glide;
import com.bumptech.glide.load.resource.bitmap.CenterCrop;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.example.allfilemanagerdemo.R;
import com.luck.picture.lib.engine.ImageEngine;
import com.luck.picture.lib.interfaces.OnCallbackListener;
import com.luck.picture.lib.utils.ActivityCompatHelper;

/**
 * @author:luck
 * @date:2019-11-13 17:02
 * @describe:Glide加載引擎
 */
public class MyImageGlideEngine implements ImageEngine {

    /**
     * 加載圖片
     *
     * @param context   上下文
     * @param url       資源url
     * @param imageView 圖片承載控件
     */
    @Override
    public void loadImage(Context context, String url, ImageView imageView) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context)
                .load(url)
                .into(imageView);
    }

    @Override
    public void loadImage(Context context, ImageView imageView, String url, int maxWidth, int maxHeight) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context)
                .load(url)
                .override(maxWidth, maxHeight)
                .into(imageView);
    }

    /**
     * 加載相冊目錄封面
     *
     * @param context   上下文
     * @param url       圖片路徑
     * @param imageView 承載圖片ImageView
     */
    @Override
    public void loadAlbumCover(Context context, String url, ImageView imageView) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context)
                .asBitmap()
                .load(url)
                .override(180, 180)
                .sizeMultiplier(0.5f)
                .transform(new CenterCrop(), new RoundedCorners(8))
                .placeholder(R.drawable.ps_image_placeholder)
                .into(imageView);
    }


    /**
     * 加載圖片列表圖片
     *
     * @param context   上下文
     * @param url       圖片路徑
     * @param imageView 承載圖片ImageView
     */
    @Override
    public void loadGridImage(Context context, String url, ImageView imageView) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context)
                .load(url)
                .override(200, 200)
                .centerCrop()
                .placeholder(R.drawable.ps_image_placeholder)
                .into(imageView);
    }

    @Override
    public void pauseRequests(Context context) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context).pauseRequests();
    }

    @Override
    public void resumeRequests(Context context) {
        if (!ActivityCompatHelper.assertValidRequest(context)) {
            return;
        }
        Glide.with(context).resumeRequests();
    }

    private MyImageGlideEngine() {
    }

    private static final class InstanceHolder {
        static final MyImageGlideEngine instance = new MyImageGlideEngine();
    }

    public static MyImageGlideEngine createGlideEngine() {
        return InstanceHolder.instance;
    }
}

10.Android13文件讀寫權限適配:

private fun initPermission() {
    if (checkPermissions()) {
        takePhoto()
    } else {
        requestPermission()
    }
}
private fun requestPermission() {
    when {
        Build.VERSION.SDK_INT >= 33 -> {
            ActivityCompat.requestPermissions(
                this,
                arrayOf(
                    Manifest.permission.READ_MEDIA_IMAGES,
                    Manifest.permission.READ_MEDIA_AUDIO,
                    Manifest.permission.READ_MEDIA_VIDEO,
                    Manifest.permission.CAMERA,
                ),
                Constants.REQUEST_CODE_PERMISSIONS
            )
        }

        else -> {
            ActivityCompat.requestPermissions(
                this,
                REQUIRED_PERMISSIONS,
                Constants.REQUEST_CODE_PERMISSIONS
            )
        }
    }
}
private fun checkPermissions(): Boolean {
    when {
        Build.VERSION.SDK_INT >= 33 -> {
            val permissions = arrayOf(
                Manifest.permission.READ_MEDIA_IMAGES,
                Manifest.permission.READ_MEDIA_AUDIO,
                Manifest.permission.READ_MEDIA_VIDEO,
                Manifest.permission.CAMERA,
            )
            for (permission in permissions) {
                return Environment.isExternalStorageManager()
            }
        }

        else -> {
            for (permission in REQUIRED_PERMISSIONS) {
                if (ContextCompat.checkSelfPermission(
                        this,
                        permission
                    ) != PackageManager.PERMISSION_GRANTED
                ) {
                    return false
                }
            }
        }
    }
    return true
}
override fun onRequestPermissionsResult(
    requestCode: Int, permissions: Array<String>, grantResults:
    IntArray
) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    when (requestCode) {
        Constants.REQUEST_CODE_PERMISSIONS -> {
            var allPermissionsGranted = true
            for (result in grantResults) {
                if (result != PackageManager.PERMISSION_GRANTED) {
                    allPermissionsGranted = false
                    break
                }
            }
            when {
                allPermissionsGranted -> {
                    // 權限已授予,執(zhí)行文件讀寫操作
                    takePhoto()
                }

                else -> {
                    // 權限被拒絕,處理權限請求失敗的情況
                    ToastUtils.showShort("請您打開必要權限")
                    requestPermission()
                }
            }
        }

    }
}

11.打開相冊:

這里有兩種方式:

11.1 以startActivityForResult方式打開

    private fun openPhotoAlbum() {
        val intent = Intent(Intent.ACTION_GET_CONTENT)
        intent.addCategory(Intent.CATEGORY_OPENABLE)
        intent.type = "image/*"
        //以startActivityForResult方式打開Activity
       startActivityForResult(
            Intent.createChooser(intent, "File Browser"), Constants.FILE_CHOOSER_RESULT_CODE)
    }

11.2 以launch方式打開

private fun openPhotoAlbum() {
     //以launch方式打開相冊
      photoLaunch.launch("image/*")
}

12.打開相冊結果回調:

12.1 startActivityResult方式結果回調:

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (resultCode != RESULT_OK) {
            return
        }
        when (requestCode) {
            Constants.FILE_CHOOSER_RESULT_CODE -> {
                if (data?.data == null) {
                    return
                }
                val imgStr: String = getImageAbsolutePath(this, data.data).toString()
                if (!TextUtils.isEmpty(imgStr)) {
                    val imgUri: Uri? = FileUtils.getUriFromPath(imgStr, application)
                    if (imgUri != null) {
                        Glide.with(this@MainActivity).load(imgUri.toString()).into(ivPhoto)
                    }
                }
            }
        }
    }
}

12.2 launch方式結果回調:

private val photoLaunch =
registerForActivityResult(ActivityResultContracts.GetContent()) { uri ->
    Glide.with(this@MainActivity).load(uri.toString()).into(ivPhoto)
}

13.實現(xiàn)的效果如下:

allfilemanagerdemo,Android版本適配,android
allfilemanagerdemo,Android版本適配,android
allfilemanagerdemo,Android版本適配,android

14.項目源碼如下:

https://gitee.com/jackning_admin/all-file-manager-demo文章來源地址http://www.zghlxwxcb.cn/news/detail-815309.html

到了這里,關于Android13適配所有文件管理權限的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • Android文件選擇器 路徑選擇 支持安卓4.4 ~ 13 支持Android/data目錄訪問 支持SD卡 適配Android11

    Android文件選擇器 路徑選擇 支持安卓4.4 ~ 13 支持Android/data目錄訪問 支持SD卡 適配Android11

    Android上進行文件選擇或操作的第三方庫,自動申請存儲權限,支持 Android4.4 ~ 13,再也不用為了適配各種版本而苦惱了,快速集成,一句代碼搞定,完善的文檔,支持無root權限訪問和操作Android/data和Android/obb目錄(適配Android 13),支持SD卡,高度自定義UI滿足你的所有需求,使用非常

    2024年02月04日
    瀏覽(23)
  • Android打開系統(tǒng)文件管理器,并獲取選中文件的路徑,適配Android10及以上無法獲取路徑

    1.進入文件管理器 2.在onActivityResult中獲取返回結果 3.FileHelper完整工具類

    2024年02月02日
    瀏覽(21)
  • Android存儲權限完美適配(Android11及以上適配)

    Android存儲權限完美適配(Android11及以上適配)

    一、Bug簡述 一個很普通的需求,需要下載圖片到本地,我的三個測試機(榮耀Android10,紅米 11 和小米Android 13都沒有問題)。 然后,主角登場了,測試的三星Android 13 死活拉不起存儲權限彈窗。 想了下,三星的系統(tǒng)可能和小米的系統(tǒng)做了些區(qū)別。于是就是看了下存儲權限的版

    2024年02月06日
    瀏覽(17)
  • Android 13 適配指南

    Android 13 適配指南

    是的,你沒看錯,現(xiàn)在就要帶你適配 Android13 。 2022 的Google I/O 發(fā)布了 Android 13 beta 2 和 Android 13 Beta 1 國內(nèi)廠商的設備支持列表,雖然按照慣例, Android 13 應該是年末才發(fā)布正式版,但是相信有的開發(fā)者已經(jīng)收到了平臺的 Android13 的適配要求,所以本篇也是結合 Oppo 的 Android 1

    2024年02月05日
    瀏覽(30)
  • Android13音頻錄制適配

    Android13音頻錄制適配

    之前寫過一篇音頻錄制的文章,當時是在Android10以下的手機可以成功錄制和播放,但是Android10及以上手機提示創(chuàng)建文件失敗,最近做過Android13的適配,索性一起把之前的錄音也適配了,記錄一下適配的過程。 主要就是文件的生成和創(chuàng)建,由于Android10以后不能隨意創(chuàng)建私有文件

    2024年02月21日
    瀏覽(26)
  • Android(6-13)適配

    Android(6-13)適配

    Android 6 1、運行時權限 android6.0以前,我們把app需要用到的權限全部羅列在Manifest清單文件中。安裝app時android系統(tǒng)會詢問用戶是否授予這些權限,拒絕后則無法安裝app。如果授予,則安裝app,之后無法修改授予狀態(tài)。 android6.0將權限分為普通權限(不涉及用戶隱私和安全)和危

    2024年02月02日
    瀏覽(23)
  • Android 13 變更及適配攻略

    Android 13 變更及適配攻略

    首先將我們項目中的 targetSdkVersion 和 compileSdkVersion 升至 33。 1.通知受限 對新安裝的應用的影響: 如果用戶在搭載 Android 13 或更高版本的設備上安裝您的應用,應用的通知默認處于關閉狀態(tài)。在您請求新的權限且用戶向您的應用授予該權限之前,您的應用都將無法發(fā)送通知。

    2024年02月03日
    瀏覽(20)
  • android8、android13自適應圖標適配

    android8、android13自適應圖標適配

    前言:為了解決應用圖標在不同android手機上的外觀樣式問題,google官方在android8和android13兩個版本做了變更(這2個版本都提供了向下兼容),下文介紹適配方法以及 注意事項(此處有彩蛋) 。 一、android8(API27)適配 1、找到資源文件夾:mipmap-anydpi-v26(若舊的as里沒有默認生成,

    2024年02月09日
    瀏覽(147)
  • Android12中藍牙權限適配

    AndroidManifest.xml 代碼 說明: 必須按照這兩步申請藍牙權限, 首先 在androidManifest.xml中配置藍牙權限,Android11及以下android.permission.BLUETOOTH、android.permission.BLUETOOTH_ADMIN申請這兩個,Android12中藍牙權限進行新增android.permission.BLUETOOTH_SCAN、android.permission.BLUETOOTH_ADVERTISE、android.permi

    2024年02月11日
    瀏覽(27)
  • 【Android 10 適配】隱私權限變更

    更詳細內(nèi)容請參考 Android 10 中的隱私權變更 Android 10(API 級別 29)引入了多項功能和行為變更,旨在更好地保護用戶的隱私。這些變更讓用戶更清楚地了解并更好地控制自己的數(shù)據(jù)及為應用提供的權能。 下面是 Android 10 中與 隱私權限 相關的主要變更。 默認情況下,以 Andr

    2024年01月22日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包