无法使用Android下载管理器获取当前下载文件大小

无法使用Android下载管理器获取当前下载文件大小,android,android-download-manager,Android,Android Download Manager,我调用下面的服务来处理给定URL的下载。正如您在下面的代码片段中所看到的,我想将当前下载文件大小分配给total_size 但是,使用Eclipse调试器,即使文件已正确下载,其值仍保持为-1。建议 public class DownloadManagerService extends IntentService { public final static String ACTION_DOWNLOAD_STARTED= "com.youzik.app.intent.action.ACT

我调用下面的服务来处理给定URL的下载。正如您在下面的代码片段中所看到的,我想将当前下载文件大小分配给total_size

但是,使用Eclipse调试器,即使文件已正确下载,其值仍保持为-1。建议

public class DownloadManagerService extends IntentService {

    public final static String ACTION_DOWNLOAD_STARTED= "com.youzik.app.intent.action.ACTION_DOWNLOAD_STARTED";
    public static final String DATA = "download";
    public static final String URL = "url";

    public DownloadManagerService() {
        super("DownloadManagerService");
    }

    @Override
    protected void onHandleIntent(Intent service) {
        Request request = new Request(Uri.parse(service.getStringExtra(URL)));
        DownloadManager downloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        long downloadId = downloadManager.enqueue(request);

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

        if (!cursor.moveToFirst()) {
            Log.v("DownloadManagerService", "download list is empty");
            return;
        }

        Download dl = new Download();
        dl.setId(cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_ID)));
        dl.setName(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE)));
        dl.setUrl(cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)));

        int total_size = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));

        cursor.close();
    }

}

确保您已在清单文件中授予所需的用户权限

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />

你的代码看起来不错。也许你想下载的服务器不支持这个。我已经测试过了。没关系。请在>1s后获取总文件大小。我猜
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_INTERNAL_STORAGE" />
 if (Build.VERSION.SDK_INT >= 23) {
        //do your check here
        askForPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE,WRITE_EXST);
        askForPermission(Manifest.permission.READ_EXTERNAL_STORAGE,READ_EXST);
    }


  private void askForPermission(String permission, Integer requestCode) {
    if (ContextCompat.checkSelfPermission(getActivity(), permission) != PackageManager.PERMISSION_GRANTED) {

        // Should we show an explanation?
        if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), permission)) {

            //This is called if user has denied the permission before
            //In this case I am just asking the permission again
            ActivityCompat.requestPermissions(getActivity(), new String[]{permission}, requestCode);

        } else {

            ActivityCompat.requestPermissions(getActivity(), new String[]{permission}, requestCode);
        }
    } else {
        // Toast.makeText(getActivity(), "" + permission + " is already granted.", Toast.LENGTH_SHORT).show();
        Log.d("Permission :: ","is already granted");
    }
}


 @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(ActivityCompat.checkSelfPermission(getActivity(), permissions[0]) == PackageManager.PERMISSION_GRANTED){
        switch (requestCode) {
            //Location
            case 1:
                // askForGPS();
                break;
            //Call
            case 2:

                break;
            //Write external Storage
            case 3:
                Log.d("Permission :: ","Write external Storage");
                break;
            //Read External Storage
            case 4:
             /*   Intent imageIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(imageIntent, 11);*/
                Log.d("Permission :: ","Read External Storage");
                break;
            //Camera
            case 5:
                break;
            case 6:
                break;
        }
        Toast.makeText(getActivity(), "Permission granted", Toast.LENGTH_SHORT).show();
    }else{
        Toast.makeText(getActivity(), "Permission denied", Toast.LENGTH_SHORT).show();
    }
}