You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

缓存目录文件移至Download目录后设备端无法显示的技术求助

Fixing Files Not Showing in Downloads Folder (Visible in ADB but Not Device)

Hey there, let's work through this annoying issue together! It's so frustrating when you move files successfully (or so it seems via ADB) but they don't show up in your device's file manager. Here are the most common fixes to get those files visible:

1. Trigger the Android Media Scanner

Android relies on its media scanner to index files so they appear in file managers and gallery apps. When you copy files directly via code, the scanner doesn't automatically pick up the new files—you need to manually trigger it:

import android.media.MediaScannerConnection;
import android.content.Context;
import java.io.File;

// Call this right after moving/copying the file
public void scanFile(Context context, File newFile) {
    MediaScannerConnection.scanFile(
        context,
        new String[]{newFile.getAbsolutePath()},
        null, // Let the system auto-detect MIME type
        (path, uri) -> {
            // Optional: Log that scanning finished
            // Log.d("MediaScanner", "Successfully scanned: " + path);
        }
    );
}

This tells the system to index the new file, and it should pop up in your file manager within a few seconds.

2. Verify Runtime Permissions (Android 6.0+)

Even if you've declared permissions in your AndroidManifest.xml, you need to request runtime permissions for Android 6.0 (API 23) and above. Double-check that you're handling this correctly:

First, add the permission to your manifest:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- For Android 13+, add relevant media permissions if needed -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />

Then request the permission at runtime before any file operations:

import android.content.pm.PackageManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;

private static final int REQUEST_STORAGE_PERMISSION = 100;

public void checkStoragePermission(Context context) {
    if (ContextCompat.checkSelfPermission(
        context,
        android.Manifest.permission.WRITE_EXTERNAL_STORAGE
    ) != PackageManager.PERMISSION_GRANTED) {
        // Ask for permission
        ActivityCompat.requestPermissions(
            (Activity) context,
            new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE},
            REQUEST_STORAGE_PERMISSION
        );
    } else {
        // Permission is granted, proceed with moving files
        moveFilesFromCacheToDownloads();
    }
}

// Handle the permission result
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_STORAGE_PERMISSION) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // Permission approved—now move your files
            moveFilesFromCacheToDownloads();
        } else {
            // Permission denied—show a message to the user
        }
    }
}

3. Use Scoped Storage-Compliant Methods (Android 10+)

Starting with Android 10 (API 29), Scoped Storage restricts direct access to external storage. If you're targeting Android 10 or higher, you can't just write to Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) directly. Instead, use MediaStore to properly add files to the Downloads folder:

import android.content.ContentValues;
import android.content.Context;
import android.net.Uri;
import android.provider.MediaStore;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;

public void saveFileToDownloads(Context context, File cacheFile, String fileName) {
    ContentValues values = new ContentValues();
    values.put(MediaStore.Downloads.DISPLAY_NAME, fileName);
    values.put(MediaStore.Downloads.MIME_TYPE, "application/octet-stream"); // Adjust MIME type for your file
    values.put(MediaStore.Downloads.RELATIVE_PATH, Environment.DIRECTORY_DOWNLOADS);

    Uri uri = context.getContentResolver().insert(MediaStore.Downloads.EXTERNAL_CONTENT_URI, values);
    if (uri != null) {
        try (OutputStream outputStream = context.getContentResolver().openOutputStream(uri);
             FileInputStream inputStream = new FileInputStream(cacheFile)) {

            byte[] buffer = new byte[1024];
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, bytesRead);
            }
            // Trigger media scan to make the file visible immediately
            scanFile(context, new File(uri.getPath()));
        } catch (IOException e) {
            e.printStackTrace();
            // Handle any file I/O errors here
        }
    }
}

This method ensures your file is registered with the system, making it visible in file managers and compliant with modern Android security rules.

4. Double-Check File Integrity

Before diving deeper, confirm the file was actually copied correctly:

  • Use adb shell ls -l /sdcard/Download/ to compare the file size with the original in your cache directory.
  • If the size is 0 or smaller than expected, there was an error during the copy operation—check your file I/O code for uncaught exceptions.

内容的提问来源于stack exchange,提问作者Slava Antonenko

火山引擎 最新活动