无法使用Android下载管理器获取当前下载文件大小
我调用下面的服务来处理给定URL的下载。正如您在下面的代码片段中所看到的,我想将当前下载文件大小分配给total_size 但是,使用Eclipse调试器,即使文件已正确下载,其值仍保持为-1。建议无法使用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
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();
}
}