【发布时间】:2017-04-07 03:47:13
【问题描述】:
我根本无法获取从 SD 卡上的图库中选择的图像的路径,但存储在设备上的图像没有问题。有几十个类似或重复的问题,但没有一个有效。
最推荐的方法(@Commonsware)是使用ContentResolver 并调用openInputStream(),所以我尝试从openInputStream() 读取字节,然后创建一个临时文件并使用该路径,但运气不好。我的“读取字节数:”System.err.println 调用显示读取了 0 个字节。
我还尝试了this、this、this、this、this 和 this,都没有工作。很多这些答案导致调用BitmapFactory#decodeStream(),问题是,我不在乎显示图像,我只需要路径!!。
请帮忙!
到目前为止的代码:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if(resultCode == Activity.RESULT_OK){
switch(requestCode){
case SELECT_FROM_GALLERY:
fromGallery = true;
path = getRealPathFromURI(data.getData());
System.err.println("*******path: " + path + "*********");
break;
}
}
}
public String getRealPathFromURI(Uri contentUri) {
String thePath = null;
String[] filePathColumn = {MediaStore.Images.Media.DATA};
Cursor cursor = getContext().getContentResolver().query(contentUri, filePathColumn, null, null, null);
if(cursor.moveToFirst()){
int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
thePath = cursor.getString(columnIndex);
}
cursor.close();
if(thePath == null){
return getImagePathExternal(contentUri);
}else {
return thePath;
}
}
public String getImagePathExternal(Uri uri){
Cursor cursor = getContext().getContentResolver().query(uri, null, null, null, null);
cursor.moveToFirst();
String document_id = cursor.getString(0);
document_id = document_id.substring(document_id.lastIndexOf(":")+1);
cursor.close();
cursor = getContext().getContentResolver().query(
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
cursor.moveToFirst();
String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
cursor.close();
if(path == null){
System.err.println("****************trying bytes route******************");
try{
InputStream in = getContext().getContentResolver().openInputStream(uri);
byte[] resultBuff = new byte[0];
byte[] buff = new byte[1024];
int k ;
while((k = in.read(buff, 0, buff.length)) > -1) {
byte[] tbuff = new byte[resultBuff.length + k]; // temp buffer size = bytes already read + bytes last read
System.arraycopy(resultBuff, 0, tbuff, 0, resultBuff.length); // copy previous bytes
System.arraycopy(buff, 0, tbuff, resultBuff.length, k); // copy current lot
resultBuff = tbuff; // call the temp buffer as your result buff
}
System.err.println("****************bytes read: "+resultBuff.length+" ******************");
File tem = new File(_tempImageDir, "temp.jpg");
FileOutputStream out = new FileOutputStream(tem);
out.write(resultBuff, 0, resultBuff.length);
return tem.getAbsolutePath();
}catch(Exception e){
e.printStackTrace();
return null;
}
}
return path;
}
Logcat(无论我使用哪种方法,此异常都不会改变):
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.venon.nakomangsp, PID: 20610
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=132074, result=-1, data=Intent { dat=content://media/external/images/media/4147 (has extras) }} to activity {com.venon.nakomangsp/com.venon.nakomangsp.SignUpActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:4058)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4101)
at android.app.ActivityThread.access$1400(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1497)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
at id.zelory.compressor.ImageUtil.getScaledBitmap(ImageUtil.java:62)
at id.zelory.compressor.ImageUtil.compressImage(ImageUtil.java:161)
at id.zelory.compressor.Compressor.compressToFile(Compressor.java:48)
at com.venon.nakomangsp.SignUpFragment.preparePicture(SignUpFragment.java:870)
at com.venon.nakomangsp.SignUpFragment.onActivityResult(SignUpFragment.java:783)
at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:165)
at com.venon.nakomangsp.SignUpActivity.onActivityResult(SignUpActivity.java:37)
at android.app.Activity.dispatchActivityResult(Activity.java:6549)
at android.app.ActivityThread.deliverResults(ActivityThread.java:4054)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:4101)
at android.app.ActivityThread.access$1400(ActivityThread.java:177)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1497)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
【问题讨论】:
-
没有路径。为什么要路径?
-
图库中没有图片的路径?那不可能是因为如果我选择不在 SD 卡上的图像,我会得到一条路径。我需要它来制作图像的压缩版本并将其发送到我的服务器
-
您不需要在BitmapFactory.decodeStream() 创建的位图上调用compress() 的路径。是什么让您认为您需要一条途径来做到这一点?
-
表示您要从图库[SD卡]中选择的图像路径...???
-
@ianhanniballake 我没有使用它进行压缩,我使用的是需要压缩路径的自定义库。
标签: java android android-contentprovider android-sdcard android-gallery