【问题标题】:No permission to write to file:///storage/9016-4EF8: Neither user 10390 nor current process has android.permission.WRITE_MEDIA_STORAGE没有写入文件的权限:///storage/9016-4EF8:用户 10390 和当前进程都没有 android.permission.WRITE_MEDIA_STORAGE
【发布时间】: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 我可以在内部存储中下载我的视频吗??

标签: android firebase


【解决方案1】:

经过一些实验,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 呢?

【讨论】:

  • 请调整您的代码。您可以删除我首先建议检查目录是否存在并创建它的代码。使用下载文件夹。
  • 我的错误仍未解决。我在想,我们可以在外部存储上下载视频,而不是在内部存储中下载视频吗?如果是,那么这样做的程序是什么??
  • 我这里提到的所有路径都在外部存储上。在可移动外部存储上。 DownloadManager 一开始不会下载到内部存储。
【解决方案2】:

我相信您正在尝试在没有 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()

【讨论】:

    猜你喜欢
    • 2019-01-09
    • 2018-03-21
    • 1970-01-01
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多