【问题标题】:Unable to upload image first time, it works in the second time第一次无法上传图片,第二次可以
【发布时间】:2019-07-04 13:41:20
【问题描述】:

我正在从我的代码中上传任何类型的文件,但问题是当我第一次运行我的代码并尝试上传图像时,当时没有上传图像。如果我先上传文件,例如一个PDF文件,它正在成功上传,然后当我上传图片时,它也成功上传。我对这个问题一无所知。请帮忙。

这是上传图片/文件的代码。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
        showFileChoser();
    } else {
        if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), Manifest.permission.CAMERA)) {
            Toast.makeText(getActivity(), "App requires Phone permission.\nPlease allow that in the device settings.", Toast.LENGTH_LONG).show();
        }

        ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, STORAGE_PERMISSION_CODE);
    }
} else {
    showFileChoser();
}

还有showFileChoser 函数。

private void showFileChoser() {
    Intent intent = new Intent();
    intent.setType("*/*");
    intent.setAction(Intent.ACTION_GET_CONTENT);
    startActivityForResult(Intent.createChooser(intent, "Select document"), PICK_DOCUMENT);
}

onActivityResult

// Handling the ima chooser activity result
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == PICK_PDF_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {
        filePath = data.getData();
        // uploadMultipart();

        try {
            execMultipartPost();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

onRequestPermissionsResult 是……

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {

    //Checking the request code of our request
    if (requestCode == STORAGE_PERMISSION_CODE) {

        //If permission is granted
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            //Displaying a toast
            Toast.makeText(getActivity(), "Permission granted now you can read the storage", Toast.LENGTH_LONG).show();
        } else {
            //Displaying another toast if permission is not granted
            Toast.makeText(getActivity(), "Oops you just denied the permission", Toast.LENGTH_LONG).show();
        }
    }
}

文件上传功能如下。

private void execMultipartPost() throws Exception {

    RequestBody requestBody;
    pBar.setVisibility(View.VISIBLE);

    final SessionManager session = new SessionManager(getActivity());
    final HashMap<String, String> loggedDetail = session.getLoggedDetail();
    HashMap<String, String> params = new HashMap<String, String>();

    String api_token = loggedDetail.get("api_token");

    if (filePath != null) {
        String path = FilePath.getPath(getActivity(), filePath);
        requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("identity_file", path)
                .addFormDataPart("training", edtTraining.getText().toString())
                .addFormDataPart("user_id", loggedDetail.get("id"))
                .addFormDataPart("experience", experience)
                .addFormDataPart("skills", edtSkills.getText().toString())
                .addFormDataPart("address_file", "")
                .addFormDataPart("cv_file", "")
                .addFormDataPart("dbs_file", "")
                .build();
    }
}

【问题讨论】:

  • 我在 DataPart 中看不到任何 File 。关注stackoverflow.com/a/40866627/7995966
  • @ADM 路径是我从文件路径转换而来的字符串
  • 您缺少第三个参数RequestBody 请参阅上面的链接。
  • 您是否尝试从Fragment 上传文件?
  • 你是在 filePath = data.getData() 中获得价值还是为空?

标签: java android android-fragments file-upload multipartentity


【解决方案1】:

据我所知,您正在从Fragment 调用requestPermissions 函数。当您使用ActivityCompat.requestPermissions 请求用户许可时,Fragment 中没有调用onRequestPermissionsResultHere is a similar problem 表示FragmentonRequestPermissionsResult 未被调用,而正在调用ActivityonRequestPermissionsResult。我认为这也是您的情况。

现在要摆脱这个问题,你需要使用

requestPermissions(new String[]{Manifest.permission.CAMERA}, STORAGE_PERMISSION_CODE);

而不是

ActivityCompat.requestPermissions(getActivity(), new String[]{Manifest.permission.CAMERA}, STORAGE_PERMISSION_CODE);

不要在您的Fragment 中使用ActivityCompat.requestPermissions,因为这将调用您调用ActivityonRequestPermissionResult,它正在启动Fragment

希望对您有所帮助。

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 2019-05-17
    • 2017-04-23
    • 2019-06-07
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    相关资源
    最近更新 更多