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 无效。
的文档
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
,一些第三方库),您应该可以只使用 File
或 InputStream
就可以了。即使上传代码确实需要 Uri
,您也可以尝试 Uri.fromFile()
从您的 File
中获取 Uri
,看看是否可行。
MediaStore
确实起作用的是使您的文件被索引并因此可供应用程序访问(那些查询MediaStore
图像的应用程序)和给用户(通过他们的 USB 电缆通过他们的 MTP 连接)。 MediaScannerConnection
及其静态 scanFile()
方法是一种相当直接的方法来为文件建立索引。只需首先确保您的文件已完全写入磁盘(例如,如果您自己写入文件,请在 flush()
之后和 close()
之前在 FileOutputStream
上调用 getFD().sync()
。
我有一个允许用户上传照片到墙上的应用程序。
该代码适用于大多数用户,但我报告说上传照片时应用程序有时会崩溃。
问题不在于从相机拍摄照片,而是当您必须拍摄照片的路径时。
导致此问题的 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 无效。
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
,一些第三方库),您应该可以只使用 File
或 InputStream
就可以了。即使上传代码确实需要 Uri
,您也可以尝试 Uri.fromFile()
从您的 File
中获取 Uri
,看看是否可行。
MediaStore
确实起作用的是使您的文件被索引并因此可供应用程序访问(那些查询MediaStore
图像的应用程序)和给用户(通过他们的 USB 电缆通过他们的 MTP 连接)。 MediaScannerConnection
及其静态 scanFile()
方法是一种相当直接的方法来为文件建立索引。只需首先确保您的文件已完全写入磁盘(例如,如果您自己写入文件,请在 flush()
之后和 close()
之前在 FileOutputStream
上调用 getFD().sync()
。