当前位置: 首页 > 知识库问答 >
问题:

从Android上传图片到我的服务器(权限被拒绝)

云宾鸿
2023-03-14

我正试图将从gallery中选择的图像上传到Springboot服务器,但当我的服务试图发布该图像时,我的文件路径权限被拒绝。我已经向我的AndroidManifest添加了以下权限:

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <!-- permission below just in case, should not be needed I believe -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

然后,我请求允许实时选择图像,然后我想把它放在一个膨胀的视图中,在那里用户可以提供关于图像的更多细节,然后把它添加到一个报告中,我将稍后发布。

Caused by: java.io.FileNotFoundException: /storage/emulated/0/DCIM/Camera/IMG_20200206_120434.jpg (Permission denied)

我在谷歌上发现这个错误的每一个点击都会指向一个不要求实时许可的人,但我甚至做了一次,我相信很多。

这是我的一些相关代码片段:

else if (view.getId() == R.id.stubNewBreedingReportSelectImageButt) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(new String[] {Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                } else {
                    getPhotoFromPhone(); // this starts the intent to pick an image
                }
            } 
        }

else if (view.getId() == R.id.stubNewBreedingReportSubmitButt) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                if (checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                    requestPermissions(new String[] {Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}, 2);
                } else {
                    submitNewBreedingReport();
                }
            } 
        }

这是从我的onClick(View View)方法。第一个工作,因为我被允许从画廊挑选一个图像。第二个可能不需要根据我发现的从Android上传图像的项目的每个例子来检查权限。

然后,当我提交图像时(在submitNewReport()方法中),我使用ExecutorService(java类)启动一个新的异步线程进行上传。在这个可调用的<>中,我获得了一个Springs RestTemplate实例,并尝试发布图像,但是当我的RestTemplate试图调用并从Uri中获取文件时,我得到的权限被拒绝。

这是我的应用程序ImageService中的上传方法:

public Gallery uploadPictureWithInfo(Uri uri, Map<String,Object> imgParams, Context context) {
        if (uri.getPath() != null) {
            File resourceFile = new File(getPathFromUri(uri,context));
            //if (resourceFile.exists()) {
                Gallery saved = null;
                Map<String,Object> params = new HashMap<>();
                params.put(PARAM_FILE, new FileSystemResource(resourceFile));
                if (imgParams.get(PARAM_GALLERY_ID) != null || (long) imgParams.get(PARAM_GALLERY_ID) > (long) 0)  {
                    params.put(PARAM_GALLERY_ID, imgParams.get(PARAM_GALLERY_ID));
                    if (imgParams.get(PARAM_DESCRIPTION) != null) {
                        params.put(PARAM_DESCRIPTION, imgParams.get(PARAM_DESCRIPTION));
                    }
                    if (imgParams.get(PARAM_PHOTOGRAPH) != null) {
                        params.put(PARAM_PHOTOGRAPH, imgParams.get(PARAM_PHOTOGRAPH));
                    }
                    if (imgParams.get(PARAM_USER_ID) != null && (long) imgParams.get(PARAM_USER_ID) > 0) {
                        params.put(PARAM_USER_ID, imgParams.get(PARAM_USER_ID));
                    }
                    HttpEntity requestEntity = new HttpEntity<>(params, AquaDbConfig.getImageHeaders());
                    ResponseEntity<Gallery> responseEntity =
                            restTemplate.exchange(AquaDbConfig.getApiUrl() + "/images/uploadImgWithInfo", HttpMethod.POST, requestEntity, Gallery.class);
                    if (responseEntity.hasBody()) {
                        saved = responseEntity.getBody();
                    }
                    return saved;
                }
            //}
        }
        return null;
    }


public static String getPathFromUri(Uri uri, Context context) {
        String[] filePath = { MediaStore.Images.Media.DATA };
        Cursor c = context.getContentResolver().query(uri,filePath, null, null, null);
        c.moveToFirst();
        int columnIndex = c.getColumnIndex(filePath[0]);
        String picturePath = c.getString(columnIndex);
        c.close();
        return picturePath;
    }

我注释掉了对file.iseXist()的检查,以通过该测试,因为否则它不会生成堆栈跟踪。

我还试图在android manifest中将我的ImageService声明为一项服务,尽管我不确定我们谈论的是同一种服务。然后我给它加上了这个许可,但没有什么不同:

        <service
            android:name=".service.MyImageFactory"
            android:permission="android.permission.READ_EXTERNAL_STORAGE">
        </service>

如果您知道如何获得对此RestTemplate POST方法的所有权限(在我回顾的示例中似乎没有其他人需要),或者我如何解决这个问题,请分享!我开始有点沮丧和卡住了。对我来说,问题是为什么android还需要另一个权限检查,以及我如何在我的uploadPictureWithInfo(..)中提供它或解决它方法?

共有1个答案

郑星辰
2023-03-14

尝试在getPhotoFromPhone()之前请求WRITE_EXTERNAL_STORAGE的权限

 类似资料:
  • 问题内容: 我正在尝试从Android设备将文件上传到php服务器。有相同问题的话题,但他使用的是不同的方法。我的Android辅助代码运行正常,并且未显示任何错误消息,但服务器未收到任何文件。这是我的示例代码,我在网上找到了。 和我的PHP服务器端代码如下 Apache正在运行。当我运行服务器时,出现此错误消息。上传文件时出错,请重试!我已经在eclipse中检查了日志数据,我认为是套接字问题,

  • 我尝试在3台机器上作为集群运行kafka,我已经在所有机器上配置了Zookeeper。现在我尝试在第一台机器上启动kafka服务器,使用 它给出的错误是 kafka安装在路径 /tmp/kafka/kafka_2.11-1.1.0/中,kafka日志在路径 /var/lib/kafka中。我已经以root用户身份登录。但我仍然收到这些错误。我检查了kafka目录bin中. sh文件的权限。所有这些

  • 在android studio中运行应用程序时,我遇到了权限被拒绝的问题。在此之前,我需要声明,我的队友可以运行代码并弹出数据,但我,我们都使用相同的代码和版本,但我使用的是mac,他们使用的是win系统。 以下是logcat信息: 下面是AndroidMainfest文件:For tools sLtaretApi="31"我尝试删除并运行没有任何更改 有人能给我一些解决这个问题的建议吗?感谢任何

  • 我添加了使用权限,包括WRITE_EXTERNAL_STORAGE,android.permission.相机,READ_EXTERNAL_STORAGEAndroidManifest.xml. 当我在Nexus6(API 24)中运行我的应用程序时,它向我抛出了以下错误: java.io.IOException:权限被拒绝 这是我的代码: 如何在权限相机运行时打开之前使用它?

  • 我想上传一张图片,我正在使用http。客户端()用于发出请求, 请求的主体和编码部分应该是什么?

  • 我在尝试将swift中的图像上载到PHP服务器时遇到问题。在php处理文件之前,一切看起来都很好。在那一刻,我得到了错误。 swft代码的相关部分是: php是 最后,我得到的错误是: ******响应数据= 上载失败