Android 9.0 以降、U ディスクのパスを取得する 2 つの方法

1 つ目は、DocumentProvider 経由です。

private void handleDocumentsProvider() { 
    String authority = "com.android.externalstorage.documents"; 
    最終 UrirootsUri =DocumentsContract.buildRootsUri("com.android.externalstorage.documents"); 
    ContentResolver リゾルバー = getContentResolver(); 
    最終 ContentProviderClient client =solver.acquireUnstableContentProviderClient( 
            authority); 
    最終パッケージマネージャー pm = getPackageManager(); 
    ProviderInfo プロバイダー = pm.resolveContentProvider(
            権限、PackageManager.GET_META_DATA); 
    if (provider == null) { 
        Log.w(TAG, "「 + 権限のプロバイダー情報の取得に失敗しました」); 
    } 
    (!provider.exported) {
        Log.w(TAG, "プロバイダーはエクスポートされていません。" + 権限のルートをロードできませんでした); 
    } 
    if (!provider.grantUriPermissions) { 
        Log.w(TAG, "プロバイダーは UriPermissions を付与していません。 " 
                + 権限のルートをロードできませんでした); 
    } 

    if (!android.Manifest.permission.MANAGE_DOCUMENTS.equals(provider.readPermission) 
            || !android.Manifest.permission.MANAGE_DOCUMENTS.equals(provider.writePermission)) { 
        Log.w(TAG, "プロバイダーは MANAGE_DOCUMENTS によって保護されていません. " 
                + 権限)のルートをロードできませんでした。
    カーソル

    カーソル = null; 
    try {
        カーソル = client.query(rootsUri, null, null, null,
    catch (RemoteException e) { 
        e.printStackTrace(); 
    while 
    (cursor.moveToNext()) { 
        String rootId = getCursorString(cursor,DocumentsContract.Root.COLUMN_ROOT_ID); 
        文字列タイトル = getCursorString(cursor,DocumentsContract.Root.COLUMN_TITLE); 
        文字列の概要 = getCursorString(cursor,DocumentsContract.Root.COLUMN_SUMMARY); 
        String documentId = getCursorString(cursor,DocumentsContract.Root.COLUMN_DOCUMENT_ID); 
        long availableBytes = getCursorLong(cursor,DocumentsContract.Root.COLUMN_AVAILABLE_BYTES); 
        long CapacityBytes = getCursorLong(cursor,DocumentsContract.Root.COLUMN_CAPACITY_BYTES);
        String mimeTypes = getCursorString(cursor,DocumentsContract.Root.COLUMN_MIME_TYPES); 
        文字列フラグ = getCursorString(cursor,DocumentsContract.Root.COLUMN_FLAGS); 
        DocumentPathBean documentPathBean = new DocumentPathBean(rootId, title, documentId, availableBytes, flags, "/storage/" + rootId); 

        Log.e(TAG, "rootId:" + rootId + "flags:" + flags); 
        if(!"primary".equals(rootId) && !"home".equals(rootId)){ 
        Log.e(TAG, "rootId:" + rootId + "title:" + title 
                +"summary:" + summary + "documentId:" + documentId +"availableBytes:" + availableBytes +"capacityBytes:" + CapacityBytes +"mimeTypes:"

2 番目のタイプは、StorageManager を介して、リフレクションが使用できない場合は必ずリフレクションを使用します。

    private HashMap<String, String> getUsbDrivePath() { 

        final StorageManager sm = getSystemService(StorageManager.class); 
        最終 List<StorageVolume> ボリューム = sm.getStorageVolumes(); 
        HashMap<String, String> パス = new HashMap<>(); 
        volume.forEach(new Consumer<StorageVolume>() { 
            @Override 
            public void accept(StorageVolume volume) {
                ファイルパス = volume.getPathFile(); 

                if (volume.isPrimary()) { 
                    Log.v("storageVolume:", " put desc Primary"); 
// pathMap.put("primary",path.getAbsolutePath()); 
                } else {
                    文字列状態 = volume.getState(); 
                    Log.v("ストレージボリューム:", "パス" + path.exists()); 
                    Log.v("ストレージボリューム:", "パス isDirectory" + path.isDirectory()); 
                    Log.v("ストレージボリューム:", "パス isFile " + path.isFile()); 
                    Log.v("ストレージボリューム:", "パス " + path.getAbsolutePath()); 
                    Log.v("storageVolume:", "put desc " + volume.getDescription(DocumentActivity.this) + "volume.isPrimary:" + volume.isPrimary()); 
// 文字列メディアストアボリューム名 = storageVolume.getメディアストアボリューム名(); 
// 文字列絶対パス = storageVolume. getDirectory().getAbsolutePath(); 


                } 


            }


        }); 

        リターンパス。

    }

おすすめ

転載: blog.csdn.net/Angle_Byron/article/details/129755466