안드로이드에서 사진을 가져오는 코드는 정말 많이 변했습니다.
오래된 소스를 가져왔을 경우 안됩니다. 저도 최근에 예전에 쓰던 코드가 안되어 삽질을 했죠.
코틀린으로 변환해서 테스트는 되었습니다만, deprecated 문제가 있긴 하네요.
이게 버전 이슈가 있을 것 같은데, 일단 동작은 하지만 나중에 보완하셔야 할 듯..
fun getFullPath(ctx : Activity, uri : Uri): String {
var result = ""
val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
var cursor : Cursor = ctx?.contentResolver?.query(uri, filePathColumn, null, null, null)!!
if(cursor == null) {
result = uri?.path.toString()
}else {
cursor.moveToFirst()
var idx = cursor.getColumnIndex(filePathColumn[0])
result = cursor.getString(idx)
cursor.close()
}
Log.e("tag", "절대 "+ result)
return result;
}
위의 코드가 잘 동작하지만,
MediaStore.Images.Media.DATA 가 deprecated 이슈가 있어서,
아래로 수정합니다.
파일 업로드도 잘되네요.
이후에 갤러리에서 가져올 때 오류가 있어서 수정합니다.
좀 더 간결하게 만들 수 있을 것 같은데,
폰 이슈가 있을 것 같아서 아래로 정리합니다.
public static String getFullPathFromUri(Context ctx, Uri fileUri) {
String fullPath = null;
final String column = "_data";
Cursor cursor = ctx.getContentResolver().query(fileUri, null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
String document_id = cursor.getString(0);
if (document_id == null) {
for (int i=0; i < cursor.getColumnCount(); i++) {
if (column.equalsIgnoreCase(cursor.getColumnName(i))) {
fullPath = cursor.getString(i);
break;
}
}
} else {
document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
cursor.close();
final String[] projection = {column};
try {
cursor = ctx.getContentResolver().query(
android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
projection, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
if (cursor != null) {
cursor.moveToFirst();
fullPath = cursor.getString(cursor.getColumnIndexOrThrow(column));
}
} finally {
if (cursor != null) cursor.close();
}
}
}
return fullPath;
}