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

安卓學習筆記:安卓11訪問/讀寫 Android/data 目錄

這篇具有很好參考價值的文章主要介紹了安卓學習筆記:安卓11訪問/讀寫 Android/data 目錄。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

省流提示:采用android studio工具開發(fā),記錄一次低級的開發(fā),避免以后忘記或者踩坑。


  • 最近有個業(yè)余項目開發(fā)到一小半,過程中需要讀寫 Android/data目錄的文件,采用常規(guī)的文件操作總是提示權(quán)限被拒絕,無奈上網(wǎng)參考了很多資料,終于得到了解決。

  • 無法訪問Android/data 的原因

  • 安卓11谷歌采用了文件沙盒存儲模式,這就導致我的app無法直接訪問android/data目錄,即使我在清單文件中加了所有文件的讀寫權(quán)限、在程序中動態(tài)申請了所有文件的讀寫權(quán)限。當然如果有root權(quán)限那就另當別論了。

  • 作為開發(fā)者該如何訪問Android/data

  1. 第一步當然是在清單文件中申請所有文件權(quán)限


    <!--讀寫-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
        tools:ignore="ScopedStorage" />
  1. 在java中動態(tài)申請:MainActivity.java的onCreate()周期中:

  
if (Build.VERSION.SDK_INT >= 23) {
            //檢測是否有寫的權(quán)限
            int permission = ActivityCompat.checkSelfPermission(this,
                    "android.permission.WRITE_EXTERNAL_STORAGE");
            if (permission != PackageManager.PERMISSION_GRANTED) {
                // 沒有寫的權(quán)限,去申請寫的權(quán)限,會彈出對話框,這里就不展示了,可以自己寫個申請權(quán)限的彈窗
          
            }
  1. 做完上面兩步,接下來就是申請android/data的權(quán)限了,這里說明一下我的情況:

  1. 我的主頁就一個:mainactivity,全部采用了動態(tài)替換Fragment的方法切換頁面,而且需要申請?zhí)厥鈾?quán)限的還是fragment中的子framgent,這就需要在他們所依賴的activity中重寫回調(diào)方法,并設(shè)置給fragment,然后通過這個fragment再次設(shè)置給子fragment。

  1. 在子fragment中某個按鈕的點擊事件中去調(diào)用SAF框架(Android Storage Access Framework),這個框架據(jù)說在4.4就引入了,可以自行百度了解。

  1. 獲取Android/data的權(quán)限:子fragment中:

//在某個按鈕的點擊事件中:
 @Override
    public void onClick(View view) {
        switch (view.getId()) {
? ? ? ? ? ? case R.id.xxxx:
? ? ? ? ? ? ? ? //把需要授權(quán)的目錄轉(zhuǎn)為Uri
? ? ? ? ? ?     Uri uri = DocumentFileUtil.pathToUri("/storage/emulated/0/Android/data");
? ? ? ? ? ? ? ? Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
 ? ? ? ? ? ? ?  intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI,uri1);
                 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                         | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                         | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
? ? ? ? ? ? ? ? //這里的第二個參數(shù)是標志的意思,用來判斷是誰把結(jié)果回調(diào)過來的。
               requireActivity().startActivityForResult(intent, 1001);
? ? ? ? ? ? break;
? ? ? ? }
}
  1. 這時候會調(diào)出這個頁面:

android/data,android,android studio,Powered by 金山文檔
  1. 在點擊授權(quán)后,程序會返回到MainActivity,所以要在這個活動中重寫onActivityResult:

? ?  @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

? ? ? ? //把onActivityResult設(shè)置fragment
        Fragment f = getSupportFragmentManager().findFragmentByTag("HOME_FRAGMENT");
        assert f != null;
        f.onActivityResult(requestCode, resultCode, data);

        switch (requestCode) {
            case 1001:
                if (resultCode == Activity.RESULT_OK) {
                    //固定永久權(quán)限,否則當重啟app時權(quán)限就沒有了
                    assert data != null;
                    getContentResolver().takePersistableUriPermission(data.getData(),
                            Intent.FLAG_GRANT_READ_URI_PERMISSION
                                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

                }

                break;

            default:
                break;
        }
  1. 通過activity設(shè)置onActivityResult給framgent后,如果子fragment也需進行相關(guān)操作,則需要通過父fragment再把onActivityResult設(shè)置給子framgent。這里有一點需注意,當我們的子fragment是父fragment通過viewPager容器添加進去的時候,沒有Tag也沒有ID,如何精準的設(shè)置給需要的這個回調(diào)的子fragment呢?

  1. 如果適配器是繼承的FragmentStatePagerAdapter,這就要用到fragment適配器的instantiateItem了。具體做法:在父fragment中尋找沒有tag和id的子fragment:

  @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
? ? ? ? //實例化適配器
        MyFragmentAdapter fragmentAdapter = (MyFragmentAdapter) vp.getAdapter();
        assert fragmentAdapter != null;
? ? ? ? //通過子fragment在viewPager的position來定位。
        UpDataMsgFragment fragment = (UpDataMsgFragment) fragmentAdapter.instantiateItem(vp, 1);
? ? ? ? //設(shè)置
        fragment.onActivityResult(requestCode, resultCode, data);
}
  1. 這樣一來子fragment就有了回調(diào),然后看他何如使用:

//回調(diào)事件,可以得到上個活動或fragment返回的結(jié)果
    @Override
    public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //判斷文件是否存在 DocumentFile
        switch (requestCode) {
            case 6666:
                if (resultCode == Activity.RESULT_OK) {
                    //persist uri
                    //固定永久權(quán)限
                    assert data != null;
                    requireActivity().getContentResolver().takePersistableUriPermission(data.getData(),
                            Intent.FLAG_GRANT_READ_URI_PERMISSION
                                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                    Log.i("回調(diào)事件:", "Access persist uri permission to Android/data");
? ? ? ? ? ? ? ? }
? ? ? ? }
}
  1. 此時子fragment就有了回調(diào)結(jié)果,可以通過Document來操作andriod/data的文件了

  1. 注意:用戶可以隨時取消你的data訪問權(quán)限,所以避免閃退,還需要在用到Document的地方寄一個判斷有無相關(guān)目錄的權(quán)限。

 public boolean isHaveAndroidDataGrant(Context context) {
        boolean b = true;
        for (UriPermission persistedUriPermission : context.getContentResolver().getPersistedUriPermissions()) {
            b = persistedUriPermission.getUri().toString().equals("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata");
? ? ? ? ? ? ? ? //這里的content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata不渴隨意更改里面的%3Ahe %2F字符,可按此格式自行拼接需要的目錄。
        }
        return  b;
    }

總結(jié):先在清單文件申請權(quán)限,然后在程序中動態(tài)申請,其次在需要授權(quán)的activity(或fragment)中啟用SFA框架,最后在回調(diào)回來的activity中重寫onActivityResult,如果是多層嵌套的fragment,則通過tag或id或position找到對應(yīng)的fragment,一層一層的傳遞過去。文章來源地址http://www.zghlxwxcb.cn/news/detail-647355.html

到了這里,關(guān)于安卓學習筆記:安卓11訪問/讀寫 Android/data 目錄的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • android 11后文件讀寫訪問權(quán)限申請

    android 11后對文件讀寫訪問權(quán)限管理 與 android 10又有了新的要求,導致在讀寫或者訪問時出現(xiàn)error:java.io.FileNotFoundException: /storage/emulated/0/file_path open failed: EACCES (Permission denied),以下為android 11文件管理權(quán)限申請辦法 回憶android 10 文件訪問權(quán)限申請 step 1: AndroidManifest中添加權(quán)限申

    2024年02月05日
    瀏覽(21)
  • Android 11 訪問 Android/data/或者getExternalCacheDir() root方式

    前言 : 需求要求安裝三方應(yīng)用ExternalCacheDir()下載下來的apk文件。 getExternalCacheDir() : /storage/emulated/0/Android/data/com. . /cache/ 獲取訪問權(quán)限 如果手機安卓版本為Android10的時候,可以在AndroidManifest.xml中添加下列代碼 以此禁用分區(qū)存儲,但這在Android11及以上版本不起作用。 root方式 (

    2024年02月21日
    瀏覽(19)
  • 手機無法訪問”xxx”目錄(Android 11及以上授予文件管理權(quán)限)的解決方法

    Android11改變了此前安卓系統(tǒng)對文件管理的規(guī)則,在Android11上,文件讀寫變成了特殊權(quán)限。應(yīng)用默認只能讀寫自己的目錄/android/data/包名,這就導致我們想修改某個文件里的內(nèi)容,結(jié)果卻沒有讀寫權(quán)限。本文主要提供一種解決方法——root+adb。 進入adb+ROOT權(quán)限開啟 我們進入 adb s

    2024年02月16日
    瀏覽(31)
  • MAC訪問MySQL下的data目錄

    1.查看創(chuàng)建表存儲路徑 2.快捷鍵com+shift+G,輸入查詢到的地址 3.終端輸入 然后輸入密碼即可 ?

    2024年02月12日
    瀏覽(17)
  • android 高版本sd卡目錄讀寫權(quán)限

    1、從安卓11不允許訪問sd目錄,官方說明如下: https://developer.android.com/about/versions/11/privacy/storage?hl=zh-cn 2、使用MediaStore方法 一手遮天 Android - 存儲: Android 11 通過 MediaStore 管理文件 - webabcd - 博客園 (cnblogs.com)? 3、關(guān)于權(quán)限的文章 (31條消息) Android 10、11分區(qū)存儲適配踩坑總結(jié)_安

    2024年02月15日
    瀏覽(17)
  • 安卓Android studio讀寫EM4305卡源碼

    安卓Android studio讀寫EM4305卡源碼

    本示例使用的發(fā)卡器:?https://item.taobao.com/item.htm?id=718720660087spm=a1z10.5-c.w4002-21818769070.15.57dc6f89txUhXE 源碼下載:AndroidstudioRFIDNFC讀寫源碼資源-CSDN文庫

    2024年01月19日
    瀏覽(24)
  • Android Studi安卓讀寫NDEF智能海報源碼

    Android Studi安卓讀寫NDEF智能海報源碼

    本示例使用的發(fā)卡器:https://item.taobao.com/item.htm?id=615391857885spm=a1z10.5-c.w4002-21818769070.11.1f60789ey1EsPH 源碼下載:AndroidstudioRFIDNFC讀寫源碼資源-CSDN文庫

    2024年01月18日
    瀏覽(22)
  • Android Studio安卓讀寫NFC Ntag標簽源碼

    Android Studio安卓讀寫NFC Ntag標簽源碼

    本示例使用的發(fā)卡器:? https://item.taobao.com/item.htm?spm=a1z10.5-c-s.w4002-21818769070.11.3513789erHXVGxid=615391857885 源碼下載:AndroidstudioRFIDNFC讀寫源碼資源-CSDN文庫?

    2024年01月15日
    瀏覽(22)
  • 安卓Android Studio讀寫MifareOne M1 IC卡源碼

    安卓Android Studio讀寫MifareOne M1 IC卡源碼

    本示例使用的發(fā)卡器: https://item.taobao.com/item.htm?id=615391857885spm=a1z10.5-c-s.w4002-21818769070.11.3d2f789eOUPJBK 源碼下載:AndroidstudioRFIDNFC讀寫源碼資源-CSDN文庫

    2024年02月01日
    瀏覽(17)
  • android免root讀寫u盤最新方法,支持安卓Q+

    本人是在寫一個app需要讀取u盤文件列表,網(wǎng)上找了好多方法,要不就是沒有media權(quán)限,要不就是收不到廣播,全部用不了,就這樣擱置了一段時間終于又找到了一個大佬的方法,在這做個筆記 谷歌從Android5.0以上已經(jīng)不支持開發(fā)者隨便讀寫手機的外部存儲(包含tf卡、otg外接

    2023年04月16日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包