問(wèn)題描述:
紅米k30pro Android版本10 targetSdk30 選擇圖片或拍照完成后上傳圖片時(shí)一直停留在上傳圖片的頁(yè)面,無(wú)法正常上傳圖片到后臺(tái)服務(wù)器。
排查過(guò)程:
之前開發(fā)測(cè)試時(shí)都是使用的Android 9及以下版本,都可以正常從相冊(cè)選擇圖片或拍照,直到使用自己的手機(jī)無(wú)意中測(cè)試發(fā)現(xiàn)頭像無(wú)法更換。 (開始還以為是框架兼容版本的問(wèn)題,都差點(diǎn)準(zhǔn)備改源碼的 [手動(dòng)苦笑])
后面冷靜下來(lái)根據(jù)打印的日志排查發(fā)現(xiàn):
在Android 9及以下版本框架返回的圖片路徑為: “/storage/emulated/0/cent/Images/null-26e74112e4d.jpg”
在我的手機(jī)上返回的路徑為:“ content://media/external/file/985”,是uri類型的地址
找到問(wèn)題的根源就好辦了。
處理辦法:
在原有的基礎(chǔ)上新增一個(gè)判斷(“path”是返回的圖片路徑,具體可以查看框架的demo):
if (path.contains("content://")) {
Uri uri = Uri.parse(path);
path = FileUtils.getFilePathByUri_BELOWAPI11(uri, this);
}
轉(zhuǎn)換的工具類我也貼出來(lái):
public class FileUtils {
/**
* Uri 轉(zhuǎn) 絕對(duì)路徑
*
* @param uri
* @return
*/
public static String getFilePathByUri_BELOWAPI11(Uri uri, Context context) {
// 以 content:// 開頭的,比如 content://media/external/file/960
if (ContentResolver.SCHEME_CONTENT.equals(uri.getScheme())) {
String path = null;
String[] projection = new String[]{MediaStore.Images.Media.DATA};
Cursor cursor = context.getContentResolver().query(uri, projection, null,
null, null);
if (cursor != null) {
if (cursor.moveToFirst()) {
int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (columnIndex > -1) {
path = cursor.getString(columnIndex);
}
}
cursor.close();
}
return path;
}
return null;
}
}
ok, 問(wèn)題解決 ,記錄。
ps: 之前我一直以為是Android Q沙盒類型的問(wèn)題,嘗試在manifest的application節(jié)點(diǎn)中沒有配置android:requestLegacyExternalStorage="true",同時(shí)開啟isAndroidQTransform(false)來(lái)關(guān)閉在Android Q 拷貝至應(yīng)用沙盒的操作,但并沒有解決我的問(wèn)題。
pss: PictureSelector框架確實(shí)很N逼,兼容性很好,非常的感謝作者無(wú)償開源的這個(gè)庫(kù),代碼質(zhì)量很高,功能很全 。