异常记录(2)——播放视频时Uri.parse()参数写错

本文记录了在视频播放开发中遇到的显示无法播放的问题,通过logcat日志分析,发现setVideoURI方法中参数拼接错误导致视频无法正常播放。修改参数后问题得以解决。

logcat:

07-23 11:21:10.138 2379-2495/com.android.launcher3 W/OpenGLRenderer: Incorrectly called buildLayer on View: ShortcutAndWidgetContainer, destroying layer...
07-23 11:21:14.741 23218-23254/com.zjw.mymultimedia I/OpenGLRenderer: Initialized EGL, version 1.4
07-23 11:21:14.741 23218-23254/com.zjw.mymultimedia D/OpenGLRenderer: Swap behavior 1

问题描述:在写播放视频的时候遇到的显示无法播放本视频,并没有error,log里面只有这三条

解决方法:发现是设置setVideoURI(Uri.parse(""))参数的时候拼接的字符串写错了,改掉就可以了

转载于:https://my.oschina.net/u/3620480/blog/1483954

<think>我们正在处理用户关于Android中Uri.parse的用法或问题的查询。根据用户需求,我们将提供清晰的解释和示例,并确保使用正确的LaTeX格式(如需要数学表达式)和中文回答。同,我们将生成相关问题。 ### 理解Uri.parse 在Android开发中,`Uri.parse()`是一个用于将字符串解析为Uri对象的静态方法。Uri(Uniform Resource Identifier)用于标识资源,如网络URL或本地文件路径。该方法属于`android.net.Uri`类。 #### 基本用法 ```java // 将字符串解析为Uri对象 Uri uri = Uri.parse("https://www.example.com"); ``` #### 常见用途 1. **启动浏览器**:通过Intent打开网页 ```java Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.example.com")); startActivity(intent); ``` 2. **拨打电话**:需要`CALL_PHONE`权限 ```java Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:123456789")); startActivity(intent); ``` 3. **发送短信**:使用`sms:`或`sms_to:`等scheme ```java Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:123456789")); intent.putExtra("sms_body", "Hello!"); startActivity(intent); ``` 4. **访问本地文件**:使用`file:` scheme(注意:从Android 7.0开始,使用FileProvider更安全) ```java Uri uri = Uri.parse("file:///sdcard/example.jpg"); ``` #### 注意事项 - **格式验证**:如果字符串格式不符合Uri规范,会抛出`NullPointerException`或解析错误。 - **编码问题**:如果字符串包含特殊字符(如空格),需要先进行URL编码。 - **安全性**:使用`file:` scheme可能引发FileUriExposedException(Android 7.0+),建议使用FileProvider[^2]。 ### 常见问题 1. **解析失败**:字符串格式不正确,例如缺少scheme(如`http:`)。 2. **权限问题**:使用某些Uri(如打电话)需要声明权限。 3. **安全性异常**:在Android 7.0及以上版本,直接使用`file:` Uri传递文件会触发FileUriExposedException。解决方案是使用FileProvider[^2]。 ```java // 使用FileProvider生成Uri Uri uri = FileProvider.getUriForFile(context, "com.example.fileprovider", new File(path)); ``` ### 示例代码 以下是一个使用Uri.parse启动浏览器的完整示例: ```java // 在Activity中 try { Uri uri = Uri.parse("https://www.example.com"); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } catch (ActivityNotFoundException e) { // 处理没有浏览器应用的情况 e.printStackTrace(); } ``` ### 总结 `Uri.parse()`是Android中处理Uri的基础方法,广泛应用于Intent跳转、资源访问等场景。开发者需注意格式规范、权限管理和安全性问题(尤其是文件共享)[^2][^3]。 §§相关问题§§ 1. 如何安全地在Android应用间共享文件? 2. 如何处理Uri解析异常? 3. 除了Uri.parse,还有哪些创建Uri对象的方法? 4. 如何自定义Uri的scheme和参数?</think>### Android Uri.parse 用法与常见问题 `Uri.parse()` 是 Android 开发中用于解析 URI 字符串的核心方法,属于 `android.net.Uri` 类。以下是详细用法和常见问题: #### 一、基本用法 ```java // 解析标准 URI 字符串 Uri uri = Uri.parse("https://www.example.com:8080/path?query=param#fragment"); // 获取 URI 组成部分 String scheme = uri.getScheme(); // "https" String host = uri.getHost(); // "www.example.com" int port = uri.getPort(); // 8080 String path = uri.getPath(); // "/path" String query = uri.getQuery(); // "query=param" String fragment = uri.getFragment(); // "fragment" ``` #### 二、常见应用场景 1. **启动 Activity** ```java // 启动网页 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://google.com")); startActivity(intent); // 拨打电话(需权限) Intent callIntent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:123456789")); ``` 2. **访问 ContentProvider** ```java // 查询联系人 Cursor cursor = getContentResolver().query( Uri.parse("content://com.android.contacts/data/phones"), null, null, null, null ); ``` 3. **文件路径处理** ```java // 访问外部存储(Android 10+ 需使用 MediaStore) Uri fileUri = Uri.parse("content://media/external/images/media/123"); // 旧版文件访问(已废弃) // Uri.parse("file:///sdcard/Download/image.jpg") ``` #### 三、常见问题与解决方案 1. **URI 格式错误** ```java // ❌ 错误:缺少 scheme Uri.parse("www.example.com"); // ✅ 正确:添加 scheme Uri.parse("https://www.example.com"); ``` 2. **权限问题** - 访问 `content://` URI 需在 `AndroidManifest.xml` 声明权限: ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``` 3. **FileUriExposedException (Android 7.0+)** - **问题**:直接使用 `file://` URI 跨应用共享会触发此异常 - **解决方案**:使用 `FileProvider` ```xml <!-- AndroidManifest.xml --> <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> ``` ```java // 生成安全的 content URI File file = new File(context.getExternalFilesDir(null), "image.jpg"); Uri uri = FileProvider.getUriForFile(context, "com.example.fileprovider", file); ``` 4. **URI 编码问题** ```java // 处理特殊字符(如空格) Uri encodedUri = Uri.parse("https://example.com/" + Uri.encode("file name with spaces.jpg")); ``` #### 四、最佳实践 1. **优先使用 `Uri.Builder` 构建复杂 URI**: ```java Uri uri = new Uri.Builder() .scheme("https") .authority("api.example.com") .appendPath("v2") .appendPath("users") .appendQueryParameter("id", "123") .fragment("section1") .build(); ``` 2. **路径参数验证**: ```java if(uri != null && "content".equals(uri.getScheme())) { // 安全操作 content URI } ``` 3. **跨版本兼容**: ```java // 检查 Scoped Storage 限制 (Android 10+) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { // 使用 MediaStore 代替直接文件路径 } ``` > 参考:Android 存储访问最佳实践[^2],ContentProvider 安全设计[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值