【发布时间】:2020-09-09 23:44:55
【问题描述】:
我收到没有权限写入外部存储的错误。 User 和 android 都无权在外部存储上写入。请帮忙。下面是我的代码。
package com.saidev.instagramquotes;
import android.Manifest;
import android.app.DownloadManager;
import android.content.Context;
import android.content.pm.PackageManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.VideoView;
import androidx.annotation.NonNull;
import androidx.core.content.PermissionChecker;
import androidx.recyclerview.widget.RecyclerView;
import com.firebase.ui.database.FirebaseRecyclerAdapter;
import com.firebase.ui.database.FirebaseRecyclerOptions;
import java.io.File;
import java.util.List;
import static androidx.core.content.PermissionChecker.checkSelfPermission;
import static com.saidev.instagramquotes.MainActivity.loadingDialog;
public class VideosAdapter extends FirebaseRecyclerAdapter<VideoItem , VideosAdapter.myViewHolder> {
ImageButton download;
ImageButton share;
/**
* Initialize a {@link RecyclerView.Adapter} that listens to a Firebase query. See
* {@link FirebaseRecyclerOptions} for configuration options.
*
* @param options
*/
public VideosAdapter(@NonNull FirebaseRecyclerOptions<VideoItem> options) {
super(options);
}
@Override
protected void onBindViewHolder(@NonNull myViewHolder holder, int position, @NonNull VideoItem model) {
holder.setdata(model);
download.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
File dir = new File("/storage/9016-4EF8/Photo Memory");
if ( !(dir.exists())) if ( ! (dir.mkdirs())) {
Toast.makeText(v.getContext(), "Sorry, could not create directory:\n\n" + dir.getAbsolutePath(),Toast.LENGTH_SHORT).show();
return;
}
File file = new File( dir, model.videoTitle);
Toast.makeText(v.getContext(), "Downloading", Toast.LENGTH_SHORT).show();
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(model.videoUrl))
.setTitle(model.videoTitle)
.setDescription("Downloading")
.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED)
.setDestinationUri(Uri.fromFile(file))
.setAllowedOverMetered(true)
.setAllowedOverRoaming(true);
DownloadManager downloadManager = (DownloadManager) v.getContext().getSystemService(Context.DOWNLOAD_SERVICE);
long downloadID = downloadManager.enqueue(request);
}
}
});
}
@NonNull
@Override
public myViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_container_video, parent, false);
download = view.findViewById(R.id.download);
share = view.findViewById(R.id.vidshare);
return new myViewHolder(view);
}
class myViewHolder extends RecyclerView.ViewHolder{
VideoView videoView;
TextView videoTitle;
public myViewHolder(@NonNull View itemView) {
super(itemView);
videoView = itemView.findViewById(R.id.videoview);
videoTitle = itemView.findViewById(R.id.textVideoTitle);
}
void setdata(VideoItem obj){
videoView.setVideoPath(obj.videoUrl);
videoTitle.setText(obj.videoTitle);
videoView.setOnPreparedListener(mp -> {
mp.start();
});
videoView.setOnCompletionListener(MediaPlayer::start);
}
}
}
我正在尝试从 url 下载视频。我正在通过回收站视图中的视频视图显示视频。 请帮我。我已经使用下载管理器从 url 下载视频。我想将下载的视频保存在用户的下载文件夹中
【问题讨论】:
-
在开始下载之前,您应该在要下载到的文件夹上使用 File.exists()。请添加该代码以便我们检查。
-
File dir = new File("/storage/9016-4EF8/Photo Memory); if ( !(dir.exists()) if ( ! (dir.mkdirs()) { Toast.makeText (v.getContext(), "抱歉,无法创建目录:\n\n" + dir.getAbsolutePath(), Toast.LENGTH_SHORT).show() return; } File file = new File(dir, model.videoTitle) ;
-
哪个异常告诉了该消息?此外,您没有告诉目录是否存在以及是否无法创建。通知我。您的应用程序无法写入可移动 micro sd 卡上的该目录。那么你的应用程序怎么可能呢?你怎么能?
-
@blackapps 我告诉过你我遇到了同样的问题:没有权限写入文件:///storage/9016-4EF8。目录存在于我的外部存储中。
-
@blackapps 我可以在内部存储中下载我的视频吗??