没有写入权限file:///storage/9016-4EF8:用户10390和当前进程都没有android.permi



我收到一个错误:没有在外部存储上写入的权限。用户和安卓都没有在扩展存储上写东西的权限。请帮忙。下面是我的代码。

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:nn" + 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下载了视频。我想把下载的视频保存在用户的下载文件夹中

我认为您试图在没有URI权限的情况下访问SD卡中的文件。在运行时授予读写权限是不够的。管理SD卡中的文件需要URI权限。SimpleStorage可以帮助您解决故障。

使用SimpleStorage访问文件非常简单:

DocumentFile folder = DocumentFileCompat.fromPath(context, "9016-4EF8", "Photo Memory");
if (folder != null) {
// folder exists
}

你可以创建这样的目录:

DocumentFile folder = DocumentFileCompat.mkdirs(context, "9016-4EF8", "Photo Memory");
if (file != null) {
// folder exists or has been created previously
}

请注意,除非您拥有URI权限,否则上述方法将不起作用。要授予它,只需调用SimpleStorage.requestStorageAccess()

经过一些实验,DownloadManager显然不会下载到外部存储或可移动micro-sd卡的根目录。

甚至连micro-sd卡上的应用程序专用目录都没有。

但是下载文件夹在外部根目录或sd卡根目录是可以的

更改

/storage/9016-4EF8/Photo Memory

/storage/9016-4EF8/Download/PhotoMemory

您将在以下方面取得成功:

request.setDestinationUri(Uri.fromFile(file));

而且。。。您不必自己创建目录。

嗯。。这提供了与相同的服务

request.setDestinationInExternalPublicDir(choice, fileName);

那么,为什么要使用文件uri呢?

最新更新