#java #android
Вопрос:
Я создал приложение-мем, которое извлекает URL-адрес изображения из API , и я анализирую их и показываю в режиме просмотра с помощью Glide , в моем макете элементов у меня есть две кнопки: одна для общего доступа и одна для загрузки изображения, я хочу, чтобы при нажатии пользователем кнопки «Загрузить» изображения загружались на телефон пользователя.
я использую для этого менеджер загрузок, но изображение не находится в нижнем режиме, вот мой класс адаптера
public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder> {
Context context;
ArrayList<Model> modelArrayList;
public Adapter(Context context, ArrayList<Model> modelArrayList) {
this.context = context;
this.modelArrayList = modelArrayList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.item_layout,parent,false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
String memeUrl = modelArrayList.get(position).getUrl();
holder.setImage(memeUrl);
holder.button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent sharing = new Intent(Intent.ACTION_SEND);
sharing.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sharing.setType("text/plain");
// String sharebody = "Quizz time beautiful app";
String subject = "Hey watch this cool meme Click this link " memeUrl "nn";
sharing.putExtra(Intent.EXTRA_TEXT, subject);
context.startActivity(Intent.createChooser(sharing, "Share using"));
}
});
holder.buttonDownload.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
downloadImage(memeUrl);
}
catch (Exception e){
e.printStackTrace();
}
}
});
}
@Override
public int getItemCount() {
return modelArrayList.size();
}
public class ViewHolder extends RecyclerView.ViewHolder{
ImageView memeImage;
Button button, buttonDownload;
public ViewHolder(@NonNull View itemView) {
super(itemView);
memeImage = itemView.findViewById(R.id.imageView);
button = itemView.findViewById(R.id.button);
buttonDownload = itemView.findViewById(R.id.btn_download);
}
void setImage(String link){
Glide.with(context).load(link).into(memeImage);
}
}
void downloadImage(String url){
DownloadManager downloadManager = null;
downloadManager = (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)
.setAllowedOverRoaming(false)
.setTitle("meme1")
.setMimeType("image/jpeg")
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, File.separator "meme1" ".jpg");
downloadManager.enqueue(request);
Toast.makeText(context, "Image downloaded", Toast.LENGTH_SHORT).show();
}
}
Logcat
2021-07-05 20:24:20.134 20262-20262/com.choudhary.memegram W/System.err:
java.lang.SecurityException: No permission to write to
/storage/emulated/0/Pictures/meme1.jpg:
Neither user 10340 nor current process has android.permission.WRITE_EXTERNAL_STORAGE.
2021-07-05 20:24:20.145 20262-20262/com.choudhary.memegram W/System.err: at
android.os.Parcel.createException(Parcel.java:1953)
2021-07-05 20:24:20.145 20262-20262/com.choudhary.memegram W/System.err: at
android.os.Parcel.readException(Parcel.java:1921)
MyMenifest
<?xml version="1.0" encoding="utf-8"?>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE "/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MemeGram">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
Комментарии:
1. На каком устройстве установлена версия Android?
2. я использую реальное устройство Android , которое является Android 9 , Pie
Ответ №1:
Вот, пожалуйста-
public void downloadFile(String url, String filepath, String title, String desc, Context context) {
if (new File(filepath).exists()) {
Toast.makeText(context, "This file is already downloaded.", Toast.LENGTH_LONG).show();
} else {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
// in order for this if to run, you must use the android 3.2 to compile your app
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle(title);
request.setDescription(desc);
}
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filepath);
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
manager.enqueue(request);
final String finalDestination = filepath;
final BroadcastReceiver onComplete = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
//Do what to do after the download completes
}
};
registerReceiver(onComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
Toast.makeText(context, "Download Started,check downloads when completed.", Toast.LENGTH_LONG).show();
}
}