Android 华为手机获取相册图片路径,获取不到问题

未经本人授权,不得转载!否则必将维权到底

有个需求,可以从系统相册选择图片,上传到服务器。那么选择从系统相册选择完图片后,图片的名字需要显示在页面上。这里出了个 Bug,华为手机用系统的方法,获取相册图片路径,返回 null。用别的品牌的手机,却又是正常的。

##问题展示:
华为 Mate10.jpg

#解决步骤:
#####1、Debug 跟了一遍代码,发现代码里面获取相册图片的路径为 null,因为做了非空判断,所以直接返回 null 了。
#####2、Google ,发生此 bug 的根本原因是版本不同导致的 Uri 的问题。Android 4.3 及以下,根据 Uri 来查询系统相册,得到照片的 path 完全没有问题。而 Android 4.4 返回的 Uri 跟 Android 4.3 及以下完全不一样。Android 4.3 返回的是文件路径,而 Android 4.4 返回的却是“content://com.android.providers.media.documents/document/image:xxxxx”,拿这个 Uri 去查询系统相册,图片路径返回肯定为 null 了。

##可行方案:通过下面的方法将 Uri 转换成我们需要的 path 即可

	public static String getImagePathFromURI(Activity activity,Uri uri) {
		Cursor cursor = activity.getContentResolver().query(uri, null, null, null, null);
		String path = null;
		if (cursor != null) {
		cursor.moveToFirst();
		String document_id = cursor.getString(0);
		document_id = document_id.substring(document_id.lastIndexOf(":") + 1);
		cursor.close();

		        cursor = activity.getContentResolver().query(
		                                                          android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
		                                                          null, MediaStore.Images.Media._ID + " = ? ", new String[]{document_id}, null);
		        if (cursor != null) {
		            cursor.moveToFirst();
		            path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
		            cursor.close();
		        }
		    }
		    return path;
		}

#逻辑完整代码:

	/**
	 * @param uri
	 * @param multipartContent
	 * @return
	 * @throws Exception 
	 */
	public static String uploadImageInWeb(String uploadKey,Uri uri,Activity context, CustomMultipartEntity multipartContent) throws Exception {
		String[] proj = { MediaStore.Images.Media.DATA };
		Cursor actualimagecursor = context.managedQuery(uri,proj,null,null,null);
		int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
		actualimagecursor.moveToFirst();
		String  img_path = "";
        //如果是华为手机,调用上面给出的方法,即可得到正确的图片途径
		if(isHuaWeiPhone()){
			img_path = getImagePathFromURI(context,uri);
		}else{
			img_path = actualimagecursor.getString(actual_image_column_index);
		}
		
		if (img_path==null) {
			return null;
		}
		File imageFile = new File(img_path);
		KeithXiaoYClient client = KeithXiaoYApplication.mClient;
		String url = Constants.serverAdd
				+ "?sessionkey="
				+ Constants.sessionKey;
		LogUtils.i("keithxiaoy", "上传的网址是----->" + url + "/");
		Map<String, String> params = new HashMap<String, String>();
		params.put("uploadFileName", imageFile.getName());
		params.put("uploadContentType", "image/png");
		params.put("uploadKey", uploadKey);
		params.put("method", "upload");
		multipartContent.addPart("uploadFile", new FileBody(imageFile));
		JSONObject object = client.uploadMediaFiles(url, params,multipartContent);
		JSONArray jsonArray = object.getJSONArray("upload");
		if (jsonArray != null) {
			LogUtils.i("keithxiaoy", "上传成功");
		} else {
			LogUtils.i("keithxiaoy", "上传失败");
		}
		return imageFile.getName();
	}

##解决后的效果展示:
图例.jpg

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
根据引用中的描述,使用Mac系统连接华为手机并升级到HarmonyOS 2.0后,无法通过官方文档提供的命令获取到UDID。因此,我推测使用Mac系统获取华为手机的UDID可能存在问题。 如果您想在Mac系统上获取华为手机的UDID,我建议您尝试以下步骤: 1. 确保您的华为手机已连接到Mac电脑,并且已启用开发者选项。您可以在手机设置中的"关于手机"或"系统"菜单中找到开发者选项,并启用USB调试模式。 2. 打开终端应用程序,在终端中输入以下命令:adb devices 这将显示已连接到Mac电脑的设备列表。确保您的华为手机显示在列表中,并具有状态"设备"。 3. 输入以下命令获取华为手机的UDID:adb shell getprop ro.serialno 这将返回华为手机的UDID号码。 请注意,这些步骤可能因您的具体情况而有所不同。如果您仍然无法成功获取华为手机的UDID,请考虑联系华为技术支持或相关论坛以获取更详细的帮助和指导。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [HarmonyOS鸿蒙App开发真机测试以及那些坑儿](https://blog.csdn.net/hanru723/article/details/117563773)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [如何获取鸿蒙系统手机的udid(待更新)](https://blog.csdn.net/weixin_37438128/article/details/117705295)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Android Q 获取设备唯一ID(UDID\GUID\UUID\SSAID\GAID)](https://blog.csdn.net/weixin_45371676/article/details/108013310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值