我无法从截图中获取拍摄的照片

时间:2018-06-09 23:13:48

标签: java android

我无法通过手机拍摄正常的照片。当我从画廊中选择截图时,一切正常,但是当它正常拍照时,它没有返回任何内容。我会给你一些代码部分,你可以看到我是如何获得图片的。

@Override
    public void onActivityResult(int reqCode, int resultCode, final Intent data) {
        super.onActivityResult(reqCode, resultCode, data);


        if (reqCode == PICK_IMAGE && resultCode == Activity.RESULT_OK) {

            final Uri imageUri = data.getData();
            final String path = getPath(getActivity(), imageUri);
            if (path != null) {

                try {
                    File f1 = new File(path);

                    final AsyncHttpClient client = new AsyncHttpClient(true, 80, 443);
                    client.addHeader("accept", "application/json");
                    final RequestParams params = new RequestParams();
                    params.put("id", id);
                    params.put("token", token);
                    params.put("avatar", f1);

还有这个

add_avatar.setOnClickListener(new View.OnClickListener() {
            @TargetApi(Build.VERSION_CODES.M)
            @Override
            public void onClick(View view) {

                //   filePickUtils.requestImageGallery(STORAGE_PERMISSION_IMAGE, true, true);
                if (getActivity().checkSelfPermission(android.Manifest.permission.READ_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {

                    // Should we show an explanation?
                    if (shouldShowRequestPermissionRationale(
                            android.Manifest.permission.READ_EXTERNAL_STORAGE)) {
                        // Explain to the user why we need to read the contacts
                    }

                    requestPermissions(new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE},
                            1);

                    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
                    // app-defined int constant that should be quite unique

                    return;
                }

                if (getActivity().checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        != PackageManager.PERMISSION_GRANTED) {

                    // Should we show an explanation?
                    if (shouldShowRequestPermissionRationale(
                            android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                        // Explain to the user why we need to read the contacts
                    }

                    requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                            1);

                    // MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE is an
                    // app-defined int constant that should be quite unique

                    return;
                }

                Intent photoPickerIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                photoPickerIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
                photoPickerIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                photoPickerIntent.setType("image/*");
                startActivityForResult(photoPickerIntent, PICK_IMAGE);

            }
        });

你会建议什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

鉴于您只需要阅读图片并将数据上传到后端服务器,我建议您使用Intent.ACTION_GET_CONTENT代替Intent.ACTION_PICK

<强>为什么

您的问题可能与Intent.ACTION_PICK需要的内容有关。文件说明:

  

输入:getData()是包含数据目录(vnd.android.cursor.dir / *)的URI,用于从中选择项目。

所以这意味着,如果你想使用Intent.ACTION_PICK,你需要提供数据目录。

同时,如果您使用Intent.ACTION_GET_CONTENT,则只需设置要搜索的文件的MIME类型(就像您现在所做的那样),并使用Context.startActivity(intent)

您可能希望阅读的文档中的其他说明:

  

输入:getType()是要检索的所需MIME类型。请注意,intent中没有提供URI,因为对返回的数据最初来自何处没有限制。如果您只能接受可以作为流打开的数据,则还可以包含CATEGORY_OPENABLE。您可以使用EXTRA_LOCAL_ONLY将内容选择限制为本地数据。您可以使用EXTRA_ALLOW_MULTIPLE来允许用户选择多个项目。

     

输出:已挑选项目的URI。这必须是content: URI,以便任何接收者都可以访问它。

如果您需要更多信息,请在此处添加评论。

示例代码:

在您的活动中

private searchImageFile() {
    Intent intent = new Intent(Intent.GET_CONTENT);

    // Filter to only show results that can be "opened"
    intent.addCategory(Intent.CATEGORY_OPENABLE);

    // Filter to show only images, using the image MIME data type.
    // it would be "*/*".
    intent.setType("image/*");

    startActivityForResult(intent, READ_REQUEST_CODE);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent resultData) {

    if (requestCode == READ_REQUEST_CODE && resultCode == Activity.RESULT_OK) {

        final Uri imageUri = resultData.getData();
        //Do something with your Uri. 
    }
}