Download Manger not working in Android Pie 9.0 NetworkSecurityConfig: No Network Security Config specified, using platform default
Asked Answered
N

2

6

On updating the device OS to Android 9.0, previously this code was working fine(Xiaomi mi A2). Now, files are not being downloaded on Android Pie 9.0.

Moreover it is working fine in Oreo, Nougat , Marshmallow

Here is the code snippet:

File myDir = new File(Environment.getExternalStorageDirectory(), "MyApp");
        if (!myDir.exists()) {
            myDir.mkdirs();
        }
        String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss",
                Locale.getDefault()).format(new Date());
        DownloadManager mgr = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
        Uri downloadUri = Uri.parse(url);
        DownloadManager.Request request = new DownloadManager.Request(
                downloadUri);
        request.setAllowedNetworkTypes(
                DownloadManager.Request.NETWORK_WIFI
                        | DownloadManager.Request.NETWORK_MOBILE).setAllowedOverMetered(true)
                .setAllowedOverRoaming(true).setTitle("Downloading demo file").
                setVisibleInDownloadsUi(true)
                .setDestinationInExternalPublicDir(folder_main + "/", timeStamp);

        mgr.enqueue(request);

Error in logcat:

11-27 11:17:28.056 4062-2814/? D/DownloadManager: [3970] Starting
11-27 11:17:28.067 4062-2814/? W/DownloadManager: [3970] Stop requested with status HTTP_DATA_ERROR
11-27 11:17:28.068 4062-2814/? D/DownloadManager: [3970] Finished with status WAITING_TO_RETRY
11-27 11:18:06.466 4062-2843/? D/DownloadManager: [3970] Starting
11-27 11:18:06.576 4062-2843/? W/DownloadManager: [3970] Stop requested with status HTTP_DATA_ERROR
11-27 11:18:06.577 4062-2843/? D/DownloadManager: [3970] Finished with status WAITING_TO_RETRY
11-27 11:19:06.581 4062-2867/? D/DownloadManager: [3968] Starting
11-27 11:19:06.737 4062-2867/? W/DownloadManager: [3968] Stop requested with status HTTP_DATA_ERROR
11-27 11:19:06.738 4062-2867/? D/DownloadManager: [3968] Finished with status WAITING_TO_RETRY
11-27 11:19:19.131 4062-2869/? D/DownloadManager: [3970] Starting
11-27 11:19:19.144 4062-2869/? W/DownloadManager: [3970] Stop requested with status HTTP_DATA_ERROR
11-27 11:19:19.144 4062-2869/? D/DownloadManager: [3970] Finished with status WAITING_TO_RETRY
11-27 11:19:36.243 4062-2872/? D/DownloadManager: [3969] Starting
11-27 11:19:36.259 4062-2872/? W/DownloadManager: [3969] Stop requested with status HTTP_DATA_ER

Any help would be appreciated. Thanks

Nonalignment answered 27/11, 2018 at 5:6 Comment(0)
N
16

This worked for me After Xiaomi mi A2 received software update notification today.

enter image description here

what worked for me

Add android:networkSecurityConfig="@xml/network_security_config" in application tag

<application
        android:name=".ApplicationClass"
        android:allowBackup="true"
        android:hardwareAccelerated="false"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:largeHeap="true"
        android:networkSecurityConfig="@xml/network_security_config"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">

where network_security_config.xml

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true" />
</network-security-config>

Create xml under res directory and then network_security_config.xml in xml folder like in the picture below

enter image description here

This explains the issue in software

Nonalignment answered 19/12, 2018 at 6:29 Comment(2)
The issue recurs after sometimes. Did you experience the same problem?Dikmen
yes sometimes ...maybe issue with OS ... well which device are you testing on ?Nonalignment
V
0
Use this Service class

public class DownloadService extends IntentService {
public DownloadService() {
    super("Download Service");
}

String CHANNEL_ID1 = "Download Notification";
String CHANNEL_NAME1 = "Download Notification";
private NotificationManager notificationManager;
private int totalFileSize;
String name;
String url;
NotificationCompat.Builder builder;
@Override
protected void onHandleIntent(Intent intent) {
    name = intent.getStringExtra("name");
    url = intent.getStringExtra("url");

    createChannels();
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT);
    Uri sounduri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    builder = new NotificationCompat.Builder(this, CHANNEL_ID1);
    builder.setContentTitle("Download");
    builder.setContentText("Downloading File");
    builder.setContentIntent(pendingIntent);
    builder.setSmallIcon(R.mipmap.ic_launcher);
    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
    builder.setLargeIcon(bm);
    builder.setSound(null);
    builder.setAutoCancel(true);
    notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    notificationManager.notify(0, builder.build());


    initDownload();

}

private void initDownload() {

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("Your Url") //Url Base here
            .build();

    RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);

    Call<ResponseBody> request = retrofitInterface.downloadFile(url);// pass your Url
    try {

        downloadFile(request.execute().body());

    } catch (IOException e) {

        e.printStackTrace();
        Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_SHORT).show();

    }
}
private void downloadFile(ResponseBody body) throws IOException {

    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Folder name";
    File folder = new File(path);
    if (!folder.exists()) {
        folder.mkdir();
    }
    int count;
    byte data[] = new byte[1024 * 4];
    long fileSize = body.contentLength();
    InputStream bis = new BufferedInputStream(body.byteStream(), 1024 * 8);
    File outputFile = new File(path, name + ".mp3");// file name & extension
    OutputStream output = new FileOutputStream(outputFile);
    long total = 0;
    long startTime = System.currentTimeMillis();
    int timeCount = 1;
    while ((count = bis.read(data)) != -1) {

        total += count;
        totalFileSize = (int) (fileSize / (Math.pow(1024, 2)));
        double current = Math.round(total / (Math.pow(1024, 2)));

        int progress = (int) ((total * 100) / fileSize);

        long currentTime = System.currentTimeMillis() - startTime;

        Download download = new Download();
        download.setTotalFileSize(totalFileSize);

        if (currentTime > 1000 * timeCount) {

            download.setCurrentFileSize((int) current);
            download.setProgress(progress);
            sendNotification(download);
            timeCount++;
        }

        output.write(data, 0, count);
    }
    onDownloadComplete();
    output.flush();
    output.close();
    bis.close();

}

private void sendNotification(Download download) {
    builder.setProgress(100, download.getProgress(), false);
    builder.setContentText("Downloading file " + download.getCurrentFileSize() + "/" + totalFileSize + " MB");
    notificationManager.notify(0, builder.build());
}


private void onDownloadComplete() {

    Download download = new Download();
    download.setProgress(100);
    notificationManager.cancel(0);
    builder.setProgress(0, 0, false);
    builder.setContentText("File Downloaded");
    //builder.setVibrate(null);
    notificationManager.notify(0, builder.build());
}

@Override
public void onTaskRemoved(Intent rootIntent) {
    notificationManager.cancel(0);
}

public void createChannels() {

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        NotificationChannel notifiCationChannel = new NotificationChannel(CHANNEL_ID1, CHANNEL_NAME1, NotificationManager.IMPORTANCE_DEFAULT);
        notifiCationChannel.enableLights(true);
        notifiCationChannel.enableVibration(false);
        notifiCationChannel.setLightColor(Color.GREEN);
        notifiCationChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
        notifiCationChannel.setShowBadge(true);
        notifiCationChannel.setSound(null,null);
        notificationManager.createNotificationChannel(notifiCationChannel);

    }
}
}

Call this method from Your activity/fragment and pass url and name

private fun startDownload() {
    val intent = Intent(this, DownloadService::class.java)
    intent.putExtra("name", name)
    intent.putExtra("url", url)
    startService(intent)

}

Retrofit Interface 

interface RetrofitInterface {

@GET
@Streaming
fun downloadFile(@Url url: String): Call<ResponseBody>
}
Vincenty answered 10/12, 2018 at 8:18 Comment(1)
thanks for your code, But i am looking to use download manager classNonalignment

© 2022 - 2024 — McMap. All rights reserved.