我根本無法獲得從SD卡上的圖庫中選擇的圖像的路徑,但存儲在設備上的圖像沒有問題。有幾十個這樣的類似或重複的問題,但他們都沒有工作。獲取從圖庫中選擇的圖像的路徑(在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)
沒有路徑。你爲什麼想要一條路? – ianhanniballake
畫廊中沒有圖像的路徑?這不能是因爲如果我選擇了一張不在SD卡上的圖像,我會得到一條路徑。我需要它來製作圖像的壓縮版本並將其發送到我的服務器 – BiGGZ
您不需要路徑來調用[compress()](https://developer.android.com/reference/android/graphics/Bitmap .html#compress(android.graphics.Bitmap.CompressFormat,%20int,%20java.io.OutputStream))[BitmapFactory.decodeStream()]創建的位圖(https://developer.android.com/reference/android /graphics/BitmapFactory.html#decodeStream(java.io.InputStream))。是什麼讓你覺得你需要一條路來做到這一點? – ianhanniballake