关于项目中audio文件无法播放的报告

简介:

BUG现象

         Nexus5等部分机型(安卓4.4版本)出现选择自定义铃声后无法播放的现象。

BUG 原因  

4.4的某些机型 使用的intent.setAction(Intent.ACTION_GET_CONTENT)获取的uri

content://com.android.providers.media.documents/document/audio%3A1407

这种格式的uri在播放音乐的方法中不识别报错

 

4.3及以下版本使用的intent.setAction(Intent.ACTION_GET_CONTENT)获取的uri

content://media/external/audio/media/91613

可以正常播放

 

解决办法

以下是Google developer.android.com 官方网页对Android 4.4 APIs的相关改动说明

 

Storage accessframework

On previousversions of Android, if you want your app to retrieve a specific type of filefrom another app, it must invoke an intent with the ACTION_GET_CONTENT action.This action is still the appropriate way to request a file that you want toimport intoyour app. However, Android 4.4 introduces the ACTION_OPEN_DOCUMENT action,which allows the user to select a file of a specific type and grant your applong-term read access to that file (possibly with write access) withoutimporting the file to your app.

其中提到了:

4.3或以下可以直接用ACTION_GET_CONTENT,4.4或以上,官方建议用ACTION_OPEN_DOCUMENT

 

但是根据其说明ACTION_GET_CONTENT是可以用的,只是ACTION_OPEN_DOCUMENT被推荐而已。但是事实上某些4.4机型(neuxs 5等)如果还用ACTION_GET_CONTENT的方法,返回的uri4.3是完全不一样的,4.3返回的是带文件路径的,4.4返回的却是content://com.android.providers.media.documents/document/audio:3951这样的,没有路径,只有音频编号的uri.

 

所以为了解决这种问题,我们尝试使用Google推荐的ACTION_OPEN_DOCUMENT action

测试结果显示,使用官方推荐的action解决了项目中的问题

代码如下:

 

  原代码:

 

                            case 1:

                                IntentintentMyRingtone = new Intent(

                                        Intent.ACTION_GET_CONTENT);

                                intentMyRingtone.setType("audio/*");

                                intentMyRingtone                                                            .setAction(Intent.ACTION_GET_CONTENT);

                                startActivityForResult(intentMyRingtone,

                                        SELECT_MY_RINGTONE);

                                break;

更改以后的代码:

case 1:

                                IntentintentMyRingtone = new Intent(

                                Intent.ACTION_GET_CONTENT);

                                intentMyRingtone.setType("audio/*");

 

                                if (Build.VERSION.SDK_INT < 19) {

                                intentMyRingtone

                                .setAction(Intent.ACTION_GET_CONTENT);

 

                                }else{

                                intentMyRingtone

                                .setAction(Intent.ACTION_OPEN_DOCUMENT);

                                }

                                startActivityForResult(intentMyRingtone,

                                SELECT_MY_RINGTONE);

                                break;

经验教训总结

机型问题有时候总是伴随着版本问题,遇到问题关注Android版本的不同有时候很重要。

前期问题没改出来也是没有考虑到报错手机的一直特征是4.4.

         Google搜索的关键词也很重要,它有时候决定整个你修改bug的方向问题,提炼出正确的搜索关键字能够快速找到相关的文章,提供了别人解决问题的经验。

         关注Android版本更新,了解重要的更新说明,项目的很多bug都是Android版本更新后,项目中的代码不适用造成的。


另外:很多开发人员也经常遇到image获取的问题



本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1548932,如需转载请自行联系原作者


相关文章
|
编解码 Android开发 数据安全/隐私保护
Android平台外部编码数据(H264/H265/AAC/PCMA/PCMU)实时预览播放技术实现
好多开发者可能疑惑,外部数据实时预览播放,到底有什么用? 是的,一般场景是用不到的,我们在开发这块前几年已经开发了非常稳定的RTMP、RTSP直播播放模块,不过也遇到这样的场景,部分设备输出编码后(视频:H.264/H.265,音频:AAC/PCMA/PCMU)的数据,比如无人机或部分智能硬件设备,回调出来的H.264/H.265数据,除了想转推到RTMP、轻量级RTSP服务或GB28181外,还需要本地预览甚至对数据做二次处理(视频分析、实时水印字符叠加等,然后二次编码),基于这样的场景诉求,我们开发了Android平台外部编码数据实时预览播放模块。
161 0
|
7月前
|
XML 编解码 算法
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
Android开发音效中录制WAV音频和录制MP3音频的讲解及实战(超详细 附源码)
301 0
|
编解码 对象存储
关于mp4 在线播放加载时间长的问题
关于mp4 在线播放加载时间长的问题
关于mp4 在线播放加载时间长的问题
|
编解码 开发者 Python
Kivy之Video控件播放远程RTSP流
Kivy之Video控件播放远程RTSP流
467 0
Kivy之Video控件播放远程RTSP流
|
存储 缓存 编解码
FFmpeg开发笔记(七):ffmpeg解码音频保存为PCM并使用软件播放
FFmpeg开发笔记(七):ffmpeg解码音频保存为PCM并使用软件播放
FFmpeg开发笔记(七):ffmpeg解码音频保存为PCM并使用软件播放
|
Ubuntu Linux
FFMPEG音频开发: Linux下采集摄像头(使用V4L2框架)数据录制成MP4视频保存到本地
FFMPEG音频开发: Linux下采集摄像头(使用V4L2框架)数据录制成MP4视频保存到本地
1479 0
FFMPEG音频开发: Linux下采集摄像头(使用V4L2框架)数据录制成MP4视频保存到本地
【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )(二)
【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )(二)
923 0
【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )(二)
【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )(一)
【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )(一)
1513 0
【FFmpeg】ffplay 播放视频命令 ( 播放 | 暂停 | 停止 | 音量控制 | 进度控制 | 音频流 / 视频流 / 字幕流 / 节目切换 )(一)