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
This worked for me After Xiaomi mi A2
received software update notification today.
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
This explains the issue in software
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>
}