不推荐使用DownloadManager COLUMN_LOCAL_FILENAME

tec*_*rer 11 android android-download-manager

在Android N上,我得到一个例外.根据文档,这是一个已知问题,它要求我使用ContentResolver.openFileDescriptor()

https://developer.android.com/reference/android/app/DownloadManager.html#COLUMN_LOCAL_FILENAME

我不知道该怎么用.这里的ContentResolver对象在哪里可以用来获取文件名?我从来没用过它.所以,我将不胜感激任何帮助.

08-04 11:20:59.765 7010 7290 W System.err:java.lang.SecurityException:不推荐使用COLUMN_LOCAL_FILENAME; 请改用ContentResolver.openFileDescriptor()

08-04 11:20:59.765 7010 7290 W System.err:在android.app.DownloadManager $ CursorTranslator.getString(DownloadManager.java:1499)

这是我的代码.

    DownloadManager.Query query = new DownloadManager.Query();
    query.setFilterById(id);
    Cursor cursor = downloadManager.query(query);

    final String downloadFilePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
    cursor.close();
Run Code Online (Sandbox Code Playgroud)

我尝试了downlaodManager.getFileUri,但不是我想要的.感谢任何帮助.

谢谢

tec*_*rer 7

以下内容现在适用于我:

    String downloadFilePath = null;
    String downloadFileLocalUri = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI));
    if (downloadFileLocalUri != null) {
        File mFile = new File(Uri.parse(downloadFileLocalUri).getPath());
        downloadFilePath = mFile.getAbsolutePath();
    }
Run Code Online (Sandbox Code Playgroud)


Vir*_*tel 6

我通过使用 代替来解决此问题DownloadManager.COLUMN_LOCAL_URI DownloadManager.COLUMN_LOCAL_FILENAME

DownloadManager.COLUMN_LOCAL_URI返回包含“ file://”的文件路径,因此您必须downloadFilePath使用downloadFilePath = downloadFilePath.replace("file://","");

这是此问题的一线解决方案:

String downloadFilePath = (c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))).replace("file://","");
Run Code Online (Sandbox Code Playgroud)

检查以下DownloadManager的完整代码:

下载FinishedReceiver.java

public class DownloadFinishedReceiver extends BroadcastReceiver {

    @Override
        public void onReceive(final Context context, Intent intent) {
            String action = intent.getAction();
            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action) && intent.getExtras()!=null) {
                Bundle extras = intent.getExtras();
                DownloadManager.Query q = new DownloadManager.Query();
                long downloadId = extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID);
                q.setFilterById(downloadId);
                Cursor c = ((DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE)).query(q);
                if (c.moveToFirst()) {
                    int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
                    if (status == DownloadManager.STATUS_SUCCESSFUL) {

                        String downloadFilePath = (c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))).replace("file://","");
                        String downloadTitle = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE));
                        c.close();

                        Log.e("DownloadPath", downloadFilePath); // Print DownloadPath in Logcat
                        Log.e("DownloadTitle", downloadTitle); // Print DownloadTitle in Logcat
                    } else if (status == DownloadManager.STATUS_FAILED) {
                        removeTempOnFailure(context, downloadId);
                    }
                }
            }
        }

        // Remove temp/cache data
        private void removeTempOnFailure(Context con, long downloadId) {
                File cacheFileDir = new File(con.getCacheDir().getAbsolutePath());
                for (File f : cacheFileDir.listFiles()) {
                    if (f.getName().contains(String.valueOf(downloadId))) {
                        f.delete();
                        break;
                    }
                }
            }
}
Run Code Online (Sandbox Code Playgroud)

AndroidMenifest.xml文件中注册BroadcastReceiver :

        <receiver
            android:name="com.example.receiver.DownloadFinishedReceiver"
            android:exported="true"
            android:process=".downloadFinished">
            <intent-filter>
                <action android:name="android.intent.action.DOWNLOAD_COMPLETE" />
            </intent-filter>
        </receiver>
Run Code Online (Sandbox Code Playgroud)

将以下方法放在您的活动中,并传递适当的参数:

     /**
     * 
     * @param downloadUrl -> Your file download url
     * @param downloadTitle -> Your file title to display in download manager
     * @param fileName -> filename with extension like music.mp3 it will store in download folder
     * @param hide -> true to hide downloadmanager in status bar, false to display it
     * @return -> it will return downloadId
     */
    private long downloadFromUrl(String downloadUrl, String downloadTitle, String fileName, boolean hide) {
        Uri uri = Uri.parse(downloadUrl);
        DownloadManager.Request request = new DownloadManager.Request(uri);
        request.setTitle(downloadTitle);
        if (hide) {
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
            request.setVisibleInDownloadsUi(false);
        } else
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);

        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName);

        DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        return manager != null ? manager.enqueue(request) : 0;
    }
Run Code Online (Sandbox Code Playgroud)

如果您在上述方法中传递hide = true,则必须在以下方法中添加以下权限 AndroidManifext.xml

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
Run Code Online (Sandbox Code Playgroud)