android 语音适配,Android多语言适配繁体中文
Android多语言适配一般默认是values/drawable目录下的文件是英文语言的资源,如果在中文下使用不同的资源则需要新建values-zh/drawable-zh-xxxdpi这样,res目录下的命名规则是drawable-语言-国家-xxxdpi,在没有特定国家的资源会先找语言相关的目录。但是中文有点特别!这也是一个坑,按常规思维drawable-zh应该是简体中文/繁体中文共有的资源,就是如果没有drawable-zh-rTw或drawable-zh-rHK的资源的话当切到繁体中文时会去drawable-zh查找资源,这样想是大错特错,实际的结果是没有繁体资源时系统会去默认的目录下查找,也就是在drawable或drawable-xxxdpi这些目录找,这个是android的bug还是故意认为HK和TW不是我大中华的?
废话不多话说,实际开发过程中会有这样的需求,就是希望所有的中文不管是繁体还是简体都是共用资源的,根据上面说的规则,如果不分别在zh-rTW和zh-rHK都放入资源的话是不可能做到了,那如果还是想省点资源怎么办呢?下面就是说说图片资源如何做到这点,这里关键要了解android资源的实现,android资源像ImageView查找资源是通过Resources来操作的,来看ImageView查找图片时的关键函数:
private void resolveUri() {
if (mDrawable != null) {
return;
}
if (getResources() == null) {
return;
}
Drawable d = null;
if (mResource != 0) {
try {
// 关键的地方
d = mContext.getDrawable(mResource);
} catch (Exception e) {
Log.w(LOG_TAG, "Unable to find resource: " + mResource, e);
// Don't try again.
mResource = 0;
}
} else if (mUri != null) {
d = getDrawableFromUri(mUri);
if (d == null) {
Log.w(LOG_TAG, "resolveUri failed on bad bitmap uri: " + mUri);
// Don't try again.
mUri = null;
}
} else {
return;
}
}
updateDrawable(d);
}
可以知道关键的地方是能过context.getDrawable来拿到的,如果我们能重写这个函数是不是就可以搞定了?答案是不能,因为这个函数是final不能被重写的,实现如下:
public final Drawable getDrawable(@DrawableRes int id) {
return getResources().getDrawable(id, getTheme());
}
能怎么办呢,答案就从上面getDrawable函数的实现找到,getDrawable是能过getResources().getDrawable来实现的,如果能重写getResources,在这里判断是否是繁体,如果是则去zh目录下查找资源,来看getResources的实现:
// Context.java
public abstract Resources getResources();
看到这里,你应该知道这个思路是可以的!于是按思中路实现,首先判断是否是繁体,然后去默认中文目录下查找
第一步:
判断是用什么语言和国家可以用resources获取config
Locale locale = context.getResources().getConfiguration().locale;
if (locale.getLanguage().equals("zh") && !locale.getCountry().equals("CN")) {
// 繁体中文
}
第二步:
去中文目录查找,首先得有一个中文的resources,当前activity的resources是繁体的,是不能直接调用的,实现方法如下:
private static void updateResource(Resources resource, Locale l) {
Configuration config = resource.getConfiguration();
config.locale = l;
resource.updateConfiguration(config, null);
}
private static Resources getApplicationResource(PackageManager pm, String pkgName, Locale l) {
Resources resourceForApplication = null;
try {
resourceForApplication = pm.getResourcesForApplication(pkgName);
updateResource(resourceForApplication, l);
} catch (PackageManager.NameNotFoundException e) {
}
return resourceForApplication;
}
//得到简体中文的resources,由于简体中文没有资源,所以会去默认的中文下去找
Resources resources = getApplicationResource(context.getApplicationContext().getPackageManager(),
context.getPackageName(), new Locale("zh", "CN"));
综合起来是重写Activity的getResources:
@Override
public Resources getResources() {
Locale locale = context.getResources().getConfiguration().locale;
if (locale.getLanguage().equals("zh") && !locale.getCountry().equals("CN")) {
// 繁体中文
Resources resources = getApplicationResource(context.getApplicationContext().getPackageManager(),
context.getPackageName(), new Locale("zh", "CN"));
if (resources != null) {
return resources;
}
}
return super.getResources();
}
这样就实现了所有中文上都共用一套资源!上面的示例在xml中指定资源或者在代码里getDrawable可以这么使用,如果是用第三方图片加载库怎么实现?这里展示一下ImageLoader的实现:
ImageLoader加载资源是默认是通过BaseImageLoader去加载的,加载时会调用BaseDownloader去获取资源,我们只要自定义Downloader就可以了:
public class NotePaperImageDownloader extends BaseImageDownloader {
// 繁体中文时用的resources
Resources mResources;
public NotePaperImageDownloader(Context context) {
super(context);
}
public NotePaperImageDownloader(Context context, int connectTimeout, int readTimeout) {
super(context, connectTimeout, readTimeout);
}
@Override
protected InputStream getStreamFromDrawable(String imageUri, Object extra) {
Locale locale = context.getResources().getConfiguration().locale;
if (locale.getLanguage().equals("zh") && !locale.getCountry().equals("CN")) {
// 繁体中文,使用简体中文的资源进行加载,否则在没有指定繁体资源时默认会去英文下找,会不会去drawable-zh-xx去找
if (mResources == null) {
Resources resources = getApplicationResource(context.getApplicationContext().getPackageManager(),
context.getPackageName(), new Locale("zh", "CN"));
if (resources == null) {
return super.getStreamFromDrawable(imageUri, extra);
}
mResources = resources;
}
String drawableIdString = Scheme.DRAWABLE.crop(imageUri);
int drawableId = Integer.parseInt(drawableIdString);
return mResources.openRawResource(drawableId);
} else {
return super.getStreamFromDrawable(imageUri, extra);
}
}
}
总结:
关于android资源的加载,只要熟悉资源加载框架context/resources/assetmanger几个关键的类就可以做很多事。
android 语音适配,Android多语言适配繁体中文相关推荐
- 系统语言为繁体中文时适配APP
有些机型可以设置语言和地域,有些只能设置语言.以汉语为例,有香港繁体.台湾繁体.简体等几种语言. 若只需要APP根据当前语言来适配(此时和地域无关),比如只要手机系统设置了繁体(不管地域选择的是中国. ...
- android 语音播报(通过手说tts 实现中文语音播报)
手说TTS介绍: 关于手说tts中文语音包的详细资料可以查看官网 http://shoushuo.com/index.html 手说TTS,是Android平台下的中文语音引擎,提供了中文文本到语音的 ...
- android 语音播报中文,android 语音播报(通过手说tts 实现中文语音播报)
手说TTS介绍: 手说TTS,是Android平台下的中文语音引擎,提供了中文文本到语音的转换. 使用手说TTS进行中文文本的朗读,包括中文简繁体.阿拉伯数字.英文字母及一些符号的混读.并且处理了中文 ...
- Android获取系统语言(区分简体中文和繁体中文) .
之前做android应用时遇到过一个问题,就是根据语言的不同而显示不同的内容 网上很多代码都是错误的,起码无法区分简体和繁体,这里给出一种方法 不涉及android任何知识,所以就归类到java这边了 ...
- android 语音通信,Android与PC间的语音通信
主要问题是语音格式的编码解码. Android端使用android.media包,AudioRecord获取由麦克风采样的语音,格式为: private final static int Sample ...
- android语音插件,Android平台离线打包 - 语音识别(Speech)插件配置
百度语音设置 需要添加的文件 将以下文件放入工程的libs下 路径 文件名SDK\libs speech-release.aar.speech_baidu-release.aar AndroidMan ...
- 如何调试Android语音功能,Android如何添加语音功能
语音指令是可穿戴体验的一个重要的部分.这使得用户可以释放双手,快速发出指令.穿戴提供了2种类型的语音操作:系统提供的 这些语音指令都是基于任务的,并且内置在Wear的平台内.我们在activity中过 ...
- Android手机模拟器如何把语言设置为中文
1.打开安卓模拟器,找到Setting(设置)选项卡并打开,如图所示: 2.找到Language and Input(语言和输入法)选项卡并打开,如图所示: 3.点击最上方的Languages选项卡, ...
- Android 项目国际化 多国语言适配
近期一个项目 ,为了响应一带一路政策...要做国际化 适配三国语言(中文,英语,葡萄牙语) emmm.... 那就开始搞吧 首先在项目里面 写好要适配国家的values-xxx-xx 比如: 各个国 ...
- android语音动画,Android逐帧动画的简单使用-语音播放效果的实现
逐帧动画(Frame-By-Frame Animation)原理很简单,即快速切换不同的图片,形成动画效果.Android中逐帧动画的实现方式也很简单,下面以语音播放效果为例说明. 1. 首先准备图片 ...
最新文章
- java 内核线程_Java:如何根据cpu内核扩展线程?
- gb2312转utf-8linux,linux GB2312转UTF-8 shell脚本
- Linux根文件系统介绍
- PHP从入门到跑路(二),基础语法,数据库操作
- 超详细的Hadoop2配置详解
- 图片处理--冰冻特效
- 如何在 macOS Monterey 中更改光标的颜色样式?
- ASP.NET 系列_01_Web Pages 教程
- autojs遍历当前页面所有控件_移动端控件(一)-弹窗(Alert/Dialog)
- #今日论文推荐#罗格斯大学王灏:保持孩子般的好奇心
- C语言打印杨辉三角的多种方法
- android用户界面组件都是放置在,Android开发工程师第十章 节 用户界面高级组件.ppt...
- 2000字精华总结,安利一个超好用的 Python 数据分析神器
- Failed to check the status of the service. No provider available for the service【已解决】
- BZOJ 5293 求和(LCA)
- 南柯33的Python学习笔记第(一)部分
- Flutter 全能型选手GetX —— 依赖管理
- 接口请求返回的状态码总览
- 解决MYSQL 8小时连接问题
- 【Angular实战/网易云】用户签到(interceptor使用)
热门文章
- 转:C语言面试题大汇总 (图像处理方向)
- C#iText7对PDF进行签章
- SecureBlackbox 2022细粒度控制的同时
- 02 Ajax表单提交
- 【机器学习】逻辑回归(LogisticRegression)原理与实战
- js 判断是域名还是ip并获取当前url中指定部分
- cv2.imread()、cv2.putText、cv2.imwrite()、cv2.waitKey()
- DAU/MAU?UGC?
- 关于嵌入式面试的一些题
- 如何截取视频中的一部分制作成GIF动态图