android 获取本地图片路径失败,cursor.getString(column_index);返回null

本文介绍了一种在Android 4.4及以上版本中获取相册图片路径的方法。通过将Intent的动作从ACTION_GET_CONTENT更改为ACTION_PICK,解决了无法获取图片完整路径的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天有个需求就是获取手机本地图片,然后二维码解析结果,跳转网页!

之前我获取图片的代码是这么写的

/*
 * 获取带二维码的相片进行扫描
 */
public void pickPictureFromAblum(View v) {
   //  打开手机中的相册
   Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); 
   innerIntent.setType("image/*");
   Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");
   this.startActivityForResult(wrapperIntent, 1);
}

而获取路劲的代码


Uri uri = data.getData();
if (!TextUtils.isEmpty(uri.getAuthority())) {

    Cursor cursor = getContentResolver().query(uri, new String[] { MediaStore.Images.Media.DATA }, null, null, null);
   if (null == cursor) {
      Toast.makeText(this, "图片没找到", Toast.LENGTH_SHORT).show();
      return;
   }

    cursor.moveToFirst();
    int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
    photo_path = cursor.getString(column_index);
    cursor.close();
} else {
   photo_path = data.getData().getPath();
}

之前我在测试机上运行后是能拿到路劲的,但是后来发现在4.4版本后就一直拿不到图片的路径,后来上网查找资料发现

这种方法调用图库并获取图片在android4.4版本之前是可行的,但是之后就不可行了,。根本原因是前者和后者返回的URI已经不是同一个了,前者URI中包含了文件的绝对路径,是有_data的,但是后者URI就没有了。所以你拿不到!
<4.4 URI:content://media/external/images/media/164 含有文件的绝对路径

》4.4URI :content://com.android.providers.media.documents/document/image:3951,只有文件的相对编号

两者返回的内容也有所不同


最终的解决方法其实很简单,就是Intent.ACTION_GET_CONTENT换成Intent.ACTION_PICK


Intent innerIntent = new Intent(Intent.ACTION_PICK); // "android.intent.action.GET_CONTENT"
innerIntent.setType("image/*");
Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");
this.startActivityForResult(wrapperIntent, 1);


虽然是个简单的bug,但是也留下点什么 防止后面会有兄弟同样的问题出现。





检查以下代码里的问题;package com.example.myapplication; import android.annotation.SuppressLint; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import androidx.annotation.Nullable; import java.util.ArrayList; import java.util.List; public class PersonDBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "Person.db"; private static final int DATABASE_VERSION = 1; public static final String TABLE_PERSON = "person"; public static final String COLUMN_ID = "id"; public static final String COLUMN_NAME = "name"; public static final String COLUMN_NUMBER = "number"; public static final String COLUMN_ISSTAR = "isstar"; private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_PERSON + " (" + COLUMN_ID + " Text, " + COLUMN_NAME + " TEXT, " + COLUMN_NUMBER + " TEXT, " + COLUMN_ISSTAR + " BOOLEANn )"; public PersonDBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS " + TABLE_PERSON); onCreate(db); } public String insertPerson(Person person){ SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put(COLUMN_NAME, person.getName()); values.put(COLUMN_NUMBER, person.getNumber()); values.put(COLUMN_ID, person.getId()); values.put(COLUMN_ISSTAR, person.isStar()); db.close(); return person.getName(); } @SuppressLint("Range") public List<Person> getAllPersons() { List<Person> persons = new ArrayList<>(); SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.query(TABLE_PERSON, null, null, null, null, null, null); if (cursor.moveToFirst()) { do { @SuppressLint("Range") Person person = new Person( cursor.getString(cursor.getColumnIndex(COLUMN_NAME)), cursor.getString(cursor.getColumnIndex(COLUMN_NUMBER)), cursor.getString(cursor.getColumnIndex(COLUMN_ID)), "true".equals(cursor.getString(cursor.getColumnIndex(COLUMN_ID))) ); persons.add(person); } while (cursor.moveToNext()); } cursor.close(); return persons; } }
最新发布
07-22
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值