Uri.parse(路径) return Android 4.4.2 中为空

Uri.parse(path) return null in Android 4.4.2

我有一个允许用户上传照片到墙上的应用程序。

该代码适用于大多数用户,但我报告说上传照片时应用程序有时会崩溃。

问题不在于从相机拍摄照片,而是当您必须拍摄照片的路径时。

导致此问题的 Android 版本是 4.4.2,但我不知道如何修复它。

post 一些代码:

activityResult:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {

        if (requestCode == CAMERA_PIC_REQUEST) {

            try {
                //picUri is a global variable Uri
                picUri = data.getData();

                cropImage();

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        else if(requestCode == PIC_CROP) {

            try{
                //thumbnail is a global variable Bitmap
                thumbnail = MediaStore.Images.Media.getBitmap(context.getContentResolver(), cropImageUri);

                setImage();
            }
            catch (Exception e) {

                e.printStackTrace();
            }

        }
    }
}

裁剪图片:

public void cropImage() {

    try {

        Intent cropIntent = new Intent("com.android.camera.action.CROP");
        //indicate image type and Uri
        cropIntent.setDataAndType(picUri, "image/*");
        //set crop properties
        cropIntent.putExtra("crop", "true");
        //indicate aspect of desired crop
        cropIntent.putExtra("aspectX", 1);
        cropIntent.putExtra("aspectY", 1);
        cropIntent.putExtra("scale", true);
        //indicate output X and Y
        cropIntent.putExtra("outputX", 700);
        cropIntent.putExtra("outputY", 700);
        //retrieve data on return
        cropIntent.putExtra("return-data", false);

        File f = createNewFile("CROP_");
        try{
            f.createNewFile();
        }
        catch (IOException e) {
            e.printStackTrace();
        }

        //cropImageUri is a global variable Uri
        cropImageUri = Uri.fromFile(f);


        cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, cropImageUri);

        //start the activity - we handle returning in onActivityResult
        startActivityForResult(cropIntent, PIC_CROP);
    }
    catch(ActivityNotFoundException anfe){

        anfe.printStackTrace();
    }
}

创建新文件:

private File createNewFile(String prefix) {

    if (prefix== null) {
        prefix="IMG_";
    }
    else if("".equalsIgnoreCase(prefix)) {
        prefix="IMG_";
    }

    File newDirectory = new File(Environment.getExternalStorageDirectory()+"/mypics/");
    if (!newDirectory.exists()) {
        if (newDirectory.mkdir()) {

        }
    }

    File file = new File(newDirectory,(prefix+System.currentTimeMillis()+".jpg"));
    if (file.exists()) {
        file.delete();
        try {
            file.createNewFile();
        }catch (IOException e) {
            e.printStackTrace();
        }
    }

    return file;
}

然后当用户点击 "send" 方法 preUploadImage 时被调用:

public void preUploadImage() {

    UploadImage uploadImage = new UploadImage();

    Uri newUri = getImageUri(thumbnail);

    try{
        //   System.out.println("uri = "+picUri);
        uploadImage.upload(getRealPathFromURI(newUri));

    }
    catch (IOException e) {
        e.printStackTrace();
    }
}

public Uri getImageUri(Bitmap inImage) {

    String path = MediaStore.Images.Media.insertImage(context.getContentResolver(), inImage, "Title", null);

    return Uri.parse(path);
}

最后一行出现错误。

return Uri.parse(path); 

这一行导致 NullPointerException

java.lang.NullPointerException: uriString
at android.net.Uri$StringUri.<init>(Uri.java:468)
at android.net.Uri$StringUri.<init>(Uri.java:458)
at android.net.Uri.parse(Uri.java:430)
at com.delsorboilario.verdebio.ScriviDomanda.getImageUri(ScriviDomanda.java:584)
at com.delsorboilario.verdebio.ScriviDomanda.preUploadImage(ScriviDomanda.java:608)
at com.delsorboilario.verdebio.ScriviDomanda.run(ScriviDomanda.java:292)

看起来像 MediaStore.Images.Media.insertImage(context.getContentResolver(), inImage, "Title", null); return 无效。

形成MediaStore.Images.Media

的文档

Insert an image and create a thumbnail for it.

Parameters

cr The content resolver to use

source The stream to use for the image

title The name of the image

description The description of the image

Returns The URL to the newly created image, or null if the image failed to be stored for any reason

我没有尝试使用 insertImage(),在这种情况下,不太清楚您为什么需要它。

首先,您似乎想要上传照片。为此,您只需要在 createNewFile() 中创建的 File。如果您自己上传(例如,HttpUrlConnection,一些第三方库),您应该可以只使用 FileInputStream 就可以了。即使上传代码确实需要 Uri,您也可以尝试 Uri.fromFile() 从您的 File 中获取 Uri,看看是否可行。

MediaStore确实起作用的是使您的文件被索引并因此可供应用程序访问(那些查询MediaStore图像的应用程序)和给用户(通过他们的 USB 电缆通过他们的 MTP 连接)。 MediaScannerConnection 及其静态 scanFile() 方法是一种相当直接的方法来为文件建立索引。只需首先确保您的文件已完全写入磁盘(例如,如果您自己写入文件,请在 flush() 之后和 close() 之前在 FileOutputStream 上调用 getFD().sync()