首页 > 其他分享 >Android TTS学习——用五种外语说出“我爱你”(转)

Android TTS学习——用五种外语说出“我爱你”(转)

时间:2023-08-09 11:02:14浏览次数:35  
标签:Engine TextToSpeech 我爱你 TTS int Android DATA CHECK

一. 简单介绍

在上一篇里


我们简单的介绍了Android里的TTS功能并实现了一个最简单的Demo例子--AndroidTTSDemoFirst,在这篇文章中我们将具体介绍用到的TTS API,并给上一个Demo增加语言选择功能,可以使用TTS引擎支持的 English、 French 、 German 、 Italian 和 Spanish 这 5大语言来进行相应的语音合成,并用这 5

二. 实例分析

我们希望做的效果如下:

 

图1 实现效果图

有了上一个例子做基础,这个Demo比较好实现,主要是增加了一个语言选择的控件Spinner,选择不同的语言,就会用对应的语言表达“我爱你”。

接下来就边实现这个Demo边讲解用到的TTS API。也是先创建一个Android工程,工程名为AndroidTTSDemoSecond,其中SDK必须选择1.6版本及以上。

其中Main.xml文件也还是很简单,在前一个AndroidTTSDemoFirst例子的基础上增加了一个Spinner控件, 如下所示:

 


[xhtml]     view plain    copy     
   
1. <?xml version="1.0" encoding="utf-8"?>  
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3. android:orientation="vertical"  
4. android:layout_width="fill_parent"  
5. android:layout_height="fill_parent"  
6. >  
7. <EditText android:id="@+id/inputText"   
8. android:hint="Input the text here!"   
9. android:layout_width="fill_parent"   
10. android:layout_height="wrap_content">  
11. </EditText>  
12. <Button android:text="Speak"   
13. android:id="@+id/speakBtn"   
14. android:layout_width="wrap_content"   
15. android:layout_height="wrap_content"  
16. android:layout_gravity="center_horizontal"  
17. android:enabled="false"  
18. ></Button>           
19. <Spinner android:id="@+id/langSelect"   
20. android:layout_width="wrap_content"   
21. android:layout_height="wrap_content"  
22. android:layout_gravity="center_horizontal">  
23. </Spinner>  
24. </LinearLayout>

 

Java文件的编写:

因为这个Demo例子只是在上一个AndroidTTSDemoFirst基础上的增加,因此可以使用上一个编写的java文件,只要把class名字改为AndroidTTSDemoSecond,如下所示:

 

[java]     view plain    copy     
   
1. public class AndroidTTSDemoSecond extends Activity implements OnInitListener{  
2. /** Called when the activity is first created. */  
3. private EditText inputText = null;  
4. private Button speakBtn = null;  
5. private static final int REQ_TTS_STATUS_CHECK = 0;  
6. private static final String TAG = "TTS Demo";  
7. private TextToSpeech mTts;  
8. @Override  
9. public void onCreate(Bundle savedInstanceState) {  
10. super.onCreate(savedInstanceState);  
11.         setContentView(R.layout.main);  
12.           
13. //检查TTS数据是否已经安装并且可用  
14. new Intent();  
15.         checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);  
16.         startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);  
17.           
18.         inputText = (EditText)findViewById(R.id.inputText);  
19.         speakBtn = (Button)findViewById(R.id.speakBtn);          
20. "This is an example of speech synthesis.");  
21. new OnClickListener() {  
22.               
23. public void onClick(View v) {  
24. // TODO Auto-generated method stub  
25. null);  
26. //朗读输入框里的内容  
27.             }  
28.             });  
29.     }  
30.       
31. //实现TTS初始化接口  
32. @Override  
33. public void onInit(int status) {  
34. // TODO Auto-generated method stub  
35. //TTS Engine初始化完成  
36. if(status == TextToSpeech.SUCCESS)  
37.         {  
38. int result = mTts.setLanguage(Locale.US);  
39. //设置发音语言  
40. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
41. //判断语言是否可用  
42.             {  
43. "Language is not available");  
44. false);  
45.             }  
46. else  
47.             {  
48. "This is an example of speech synthesis.", TextToSpeech.QUEUE_ADD, null);  
49. true);  
50.             }  
51.         }  
52.           
53.     }  
54.       
55. protected  void onActivityResult(int requestCode, int resultCode, Intent data) {  
56. if(requestCode == REQ_TTS_STATUS_CHECK)  
57.         {  
58. switch (resultCode) {  
59. case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:  
60. //这个返回结果表明TTS Engine可以用  
61.             {  
62. new TextToSpeech(this, this);  
63. "TTS Engine is installed!");  
64.                   
65.             }  
66.                   
67. break;  
68. case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:  
69. //需要的语音数据已损坏  
70. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:  
71. //缺少需要语言的语音数据  
72. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:  
73. //缺少需要语言的发音数据  
74.             {  
75. //这三种情况都表明数据有错,重新下载安装需要的数据  
76. "Need language stuff:"+resultCode);  
77. new Intent();  
78.                 dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);  
79.                 startActivity(dataIntent);  
80.                   
81.             }  
82. break;  
83. case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:  
84. //检查失败  
85. default:  
86. "Got a failure. TTS apparently not available");  
87. break;  
88.             }  
89.         }  
90. else  
91.         {  
92. //其他Intent返回的结果  
93.         }  
94.         }  
95.       
96. @Override  
97. protected void onPause() {  
98. // TODO Auto-generated method stub  
99. super.onPause();  
100. if(mTts != null)  
101. //activity暂停时也停止TTS  
102.         {  
103.             mTts.stop();  
104.         }  
105.     }  
106.       
107. @Override  
108. protected void onDestroy() {  
109. // TODO Auto-generated method stub  
110. super.onDestroy();  
111. //释放TTS的资源  
112.         mTts.shutdown();  
113.         }  
114.     }

 

下面简单介绍下上面代码中和TTS相关的一些API使用。

首先是实现 OnInitListener 这个接口,这个接口中只有一个抽象函数 void  onInit( int  status),在 TextToSpeech 引擎初始化完成后调用,在这个函数里就可以根据状态 status(为TextToSpeech.SUCCESS 或者 TextToSpeech. Error )判断TTS


 

接着在使用TTS 时,会先启动一个 Activity 检查 TTS 引擎需要的 TTS 数据是否已经安装并且可用,checkIntent. setAction ( TextToSpeech .Engine. ACTION_CHECK_TTS_DATA );

这个 Activity会返回如下结果之一: CHECK_VOICE_DATA_PASS ,  CHECK_VOICE_DATA_FAIL , CHECK_VOICE_DATA_BAD_DATA ,  CHECK_VOICE_DATA_MISSING_DATA ,  或者CHECK_VOICE_DATA_MISSING_VOLUME . 

只有第一个结果 CHECK_VOICE_DATA_PASS 表明 TTS数据可用,其他都是数据不可用的结果,可以启动一个 Activity 去安装需要的 TTS

dataIntent.setAction(TextToSpeech.Engine. ACTION_INSTALL_TTS_DATA );


 

当数据可用时,就可以创建一个TextToSpeech

public TextToSpeech ( Context  context,  TextToSpeech.OnInitListener  listener)

这里需要两个参数,一个是 TTS 实例运行的 Context;

另一个是初始化接口的实现,在实例的创建过程中,如果TTS 引擎没有运行的话,则会初始化 TTS 引擎,并且在初始化完成后调用其第二个参数 listener


 

有了 TextToSpeech实例,接下来就可以对文本进行语音合成并发音了,对应的 API为

public int speak ( String  text, int queueMode,  HashMap < String ,  String > params)

这里需要三个参数,第一个为要合成的文本;

第二个为使用 TTS队列的方式,因为使用TTS合成语音时需要时间,TTS引擎就会把还没有轮到的部分放在其队列中排队,后来的内容有两种使用队列的方式: QUEUE_ADD   或者   QUEUE_FLUSH, QUEUE_ADD 表示把当前需要合成的内容添加到 TTS队列的后面,等前面的都完成了后再轮到他,QUEUE_FLUSH 表示清除队列中原有的内容,直接使 TTS引擎对当前内容进行语音合成,一般来说适合比较紧急的情况使用,但因为在 Android 中可能不止你一个程序使用 TTS 引擎,因此为了不破坏其他人的数据,建议使用 QUEUE_ADD

第三个为键值对表示的一个参数,我们后面再来介绍,目前可以使其为 null

 

前半部分简单的介绍了前一个Demo 用到的 API ,下半部分添加这个 Demo

首先为 Spinner

 


[java]     view plain    copy     
   
1. private Spinner langSelect = null;  
2. private String languages[]={"English","French","German","Italian","Spanish"};


 

接着添加 Spinner

 


[java]  view plain copy

1. langSelect = (Spinner)findViewById(R.id.langSelect);  
2.           
3. "I love you");  
4.           
5. new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, languages);  
6.         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  
7.         langSelect.setAdapter(adapter);  
8. 0);

 

和TTS 相关的部分是 Spinner

 


[java]  view plain copy

1.     langSelect.setOnItemSelectedListener(new OnItemSelectedListener() {  
2. public void onItemSelected(AdapterView<?> parent, View view,  
3. int position, long id) {  
4. // TODO Auto-generated method stub  
5. int pos = langSelect.getSelectedItemPosition();  
6. int result = -1;  
7. switch (pos) {  
8. case 0:  
9.     {  
10. "I love you");  
11.         result = mTts.setLanguage(Locale.US);  
12.     }  
13.           
14. break;  
15. case 1:  
16.     {  
17. "Je t'aime");  
18.         result = mTts.setLanguage(Locale.FRENCH);  
19.     }  
20. break;  
21. case 2:  
22.     {  
23. "Ich liebe dich");  
24.         result = mTts.setLanguage(Locale.GERMAN);  
25.     }  
26. break;  
27. case 3:  
28.     {  
29. "Ti amo");  
30.         result = mTts.setLanguage(Locale.ITALIAN);  
31.     }  
32. break;  
33. case 4:  
34.     {  
35. "Te quiero");  
36. new Locale("spa", "ESP"));  
37.     }  
38. break;  
39. default:  
40. break;  
41.     }  
42. //设置发音语言  
43. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
44. //判断语言是否可用  
45.     {  
46. "Language is not available");  
47. false);  
48.     }  
49. else  
50.     {  
51. true);  
52.     }  
53. }  
54. public void onNothingSelected(AdapterView<?> arg) {  
55. // TODO Auto-generated method stub  
56.       
57. }  
58. );

 

在选择不同的 item时,为 inputText

为TTS 引擎设置语言的 API

public int setLanguage ( Locale  loc)

使用Locale 这个表示语言及国家区域的类来设置语言,目前支持 English、 French 、 German 、 Italian 和Spanish 这 5大语言, 返回的结果为

LANG_AVAILABLE ,  LANG_COUNTRY_AVAILABLE ,  LANG_COUNTRY_VAR_AVAILABLE , LANG_MISSING_DATA   和 LANG_NOT_SUPPORTED 。其中 LANG_MISSING_DATA   和LANG_NOT_SUPPORTED

Demo

 

 

图2 

    文章对应的完整代码例子可以在这里下载:

     

注:文章参加“ 首届Google暑期大学生博客分享大赛——2010 Andriod篇”


一. 简单介绍

在上一篇里


我们简单的介绍了Android里的TTS功能并实现了一个最简单的Demo例子--AndroidTTSDemoFirst,在这篇文章中我们将具体介绍用到的TTS API,并给上一个Demo增加语言选择功能,可以使用TTS引擎支持的 English、 French 、 German 、 Italian 和 Spanish 这 5大语言来进行相应的语音合成,并用这 5

二. 实例分析

我们希望做的效果如下:

 

图1 实现效果图

有了上一个例子做基础,这个Demo比较好实现,主要是增加了一个语言选择的控件Spinner,选择不同的语言,就会用对应的语言表达“我爱你”。

接下来就边实现这个Demo边讲解用到的TTS API。也是先创建一个Android工程,工程名为AndroidTTSDemoSecond,其中SDK必须选择1.6版本及以上。

其中Main.xml文件也还是很简单,在前一个AndroidTTSDemoFirst例子的基础上增加了一个Spinner控件, 如下所示:

 


[xhtml]  view plain copy

1. <?xml version="1.0" encoding="utf-8"?>  
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3. android:orientation="vertical"  
4. android:layout_width="fill_parent"  
5. android:layout_height="fill_parent"  
6. >  
7. <EditText android:id="@+id/inputText"   
8. android:hint="Input the text here!"   
9. android:layout_width="fill_parent"   
10. android:layout_height="wrap_content">  
11. </EditText>  
12. <Button android:text="Speak"   
13. android:id="@+id/speakBtn"   
14. android:layout_width="wrap_content"   
15. android:layout_height="wrap_content"  
16. android:layout_gravity="center_horizontal"  
17. android:enabled="false"  
18. ></Button>           
19. <Spinner android:id="@+id/langSelect"   
20. android:layout_width="wrap_content"   
21. android:layout_height="wrap_content"  
22. android:layout_gravity="center_horizontal">  
23. </Spinner>  
24. </LinearLayout>

 

Java文件的编写:

因为这个Demo例子只是在上一个AndroidTTSDemoFirst基础上的增加,因此可以使用上一个编写的java文件,只要把class名字改为AndroidTTSDemoSecond,如下所示:

 


[java]  view plain copy

1. public class AndroidTTSDemoSecond extends Activity implements OnInitListener{  
2. /** Called when the activity is first created. */  
3. private EditText inputText = null;  
4. private Button speakBtn = null;  
5. private static final int REQ_TTS_STATUS_CHECK = 0;  
6. private static final String TAG = "TTS Demo";  
7. private TextToSpeech mTts;  
8. @Override  
9. public void onCreate(Bundle savedInstanceState) {  
10. super.onCreate(savedInstanceState);  
11.         setContentView(R.layout.main);  
12.           
13. //检查TTS数据是否已经安装并且可用  
14. new Intent();  
15.         checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);  
16.         startActivityForResult(checkIntent, REQ_TTS_STATUS_CHECK);  
17.           
18.         inputText = (EditText)findViewById(R.id.inputText);  
19.         speakBtn = (Button)findViewById(R.id.speakBtn);          
20. "This is an example of speech synthesis.");  
21. new OnClickListener() {  
22.               
23. public void onClick(View v) {  
24. // TODO Auto-generated method stub  
25. null);  
26. //朗读输入框里的内容  
27.             }  
28.             });  
29.     }  
30.       
31. //实现TTS初始化接口  
32. @Override  
33. public void onInit(int status) {  
34. // TODO Auto-generated method stub  
35. //TTS Engine初始化完成  
36. if(status == TextToSpeech.SUCCESS)  
37.         {  
38. int result = mTts.setLanguage(Locale.US);  
39. //设置发音语言  
40. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
41. //判断语言是否可用  
42.             {  
43. "Language is not available");  
44. false);  
45.             }  
46. else  
47.             {  
48. "This is an example of speech synthesis.", TextToSpeech.QUEUE_ADD, null);  
49. true);  
50.             }  
51.         }  
52.           
53.     }  
54.       
55. protected  void onActivityResult(int requestCode, int resultCode, Intent data) {  
56. if(requestCode == REQ_TTS_STATUS_CHECK)  
57.         {  
58. switch (resultCode) {  
59. case TextToSpeech.Engine.CHECK_VOICE_DATA_PASS:  
60. //这个返回结果表明TTS Engine可以用  
61.             {  
62. new TextToSpeech(this, this);  
63. "TTS Engine is installed!");  
64.                   
65.             }  
66.                   
67. break;  
68. case TextToSpeech.Engine.CHECK_VOICE_DATA_BAD_DATA:  
69. //需要的语音数据已损坏  
70. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_DATA:  
71. //缺少需要语言的语音数据  
72. case TextToSpeech.Engine.CHECK_VOICE_DATA_MISSING_VOLUME:  
73. //缺少需要语言的发音数据  
74.             {  
75. //这三种情况都表明数据有错,重新下载安装需要的数据  
76. "Need language stuff:"+resultCode);  
77. new Intent();  
78.                 dataIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);  
79.                 startActivity(dataIntent);  
80.                   
81.             }  
82. break;  
83. case TextToSpeech.Engine.CHECK_VOICE_DATA_FAIL:  
84. //检查失败  
85. default:  
86. "Got a failure. TTS apparently not available");  
87. break;  
88.             }  
89.         }  
90. else  
91.         {  
92. //其他Intent返回的结果  
93.         }  
94.         }  
95.       
96. @Override  
97. protected void onPause() {  
98. // TODO Auto-generated method stub  
99. super.onPause();  
100. if(mTts != null)  
101. //activity暂停时也停止TTS  
102.         {  
103.             mTts.stop();  
104.         }  
105.     }  
106.       
107. @Override  
108. protected void onDestroy() {  
109. // TODO Auto-generated method stub  
110. super.onDestroy();  
111. //释放TTS的资源  
112.         mTts.shutdown();  
113.         }  
114.     }

下面简单介绍下上面代码中和TTS相关的一些API使用。

首先是实现 OnInitListener 这个接口,这个接口中只有一个抽象函数 void  onInit( int  status),在 TextToSpeech 引擎初始化完成后调用,在这个函数里就可以根据状态 status(为TextToSpeech.SUCCESS 或者 TextToSpeech. Error )判断TTS


 

接着在使用TTS 时,会先启动一个 Activity 检查 TTS 引擎需要的 TTS 数据是否已经安装并且可用,checkIntent. setAction ( TextToSpeech .Engine. ACTION_CHECK_TTS_DATA );

这个 Activity会返回如下结果之一: CHECK_VOICE_DATA_PASS ,  CHECK_VOICE_DATA_FAIL , CHECK_VOICE_DATA_BAD_DATA ,  CHECK_VOICE_DATA_MISSING_DATA ,  或者CHECK_VOICE_DATA_MISSING_VOLUME . 

只有第一个结果 CHECK_VOICE_DATA_PASS 表明 TTS数据可用,其他都是数据不可用的结果,可以启动一个 Activity 去安装需要的 TTS

dataIntent.setAction(TextToSpeech.Engine. ACTION_INSTALL_TTS_DATA );


 

当数据可用时,就可以创建一个TextToSpeech

public TextToSpeech ( Context  context,  TextToSpeech.OnInitListener  listener)

这里需要两个参数,一个是 TTS 实例运行的 Context;

另一个是初始化接口的实现,在实例的创建过程中,如果TTS 引擎没有运行的话,则会初始化 TTS 引擎,并且在初始化完成后调用其第二个参数 listener


 

有了 TextToSpeech实例,接下来就可以对文本进行语音合成并发音了,对应的 API为

public int speak ( String  text, int queueMode,  HashMap < String ,  String > params)

这里需要三个参数,第一个为要合成的文本;

第二个为使用 TTS队列的方式,因为使用TTS合成语音时需要时间,TTS引擎就会把还没有轮到的部分放在其队列中排队,后来的内容有两种使用队列的方式: QUEUE_ADD   或者   QUEUE_FLUSH, QUEUE_ADD 表示把当前需要合成的内容添加到 TTS队列的后面,等前面的都完成了后再轮到他,QUEUE_FLUSH 表示清除队列中原有的内容,直接使 TTS引擎对当前内容进行语音合成,一般来说适合比较紧急的情况使用,但因为在 Android 中可能不止你一个程序使用 TTS 引擎,因此为了不破坏其他人的数据,建议使用 QUEUE_ADD

第三个为键值对表示的一个参数,我们后面再来介绍,目前可以使其为 null

 

前半部分简单的介绍了前一个Demo 用到的 API ,下半部分添加这个 Demo

首先为 Spinner

 


[java]  view plain copy

1. private Spinner langSelect = null;  
2. private String languages[]={"English","French","German","Italian","Spanish"};

 

接着添加 Spinner

 


[java]  view plain copy

1. langSelect = (Spinner)findViewById(R.id.langSelect);  
2.           
3. "I love you");  
4.           
5. new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, languages);  
6.         adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  
7.         langSelect.setAdapter(adapter);  
8. 0);

 

和TTS 相关的部分是 Spinner

 


[java]     view plain    copy     
   
1.     langSelect.setOnItemSelectedListener(new OnItemSelectedListener() {  
2. public void onItemSelected(AdapterView<?> parent, View view,  
3. int position, long id) {  
4. // TODO Auto-generated method stub  
5. int pos = langSelect.getSelectedItemPosition();  
6. int result = -1;  
7. switch (pos) {  
8. case 0:  
9.     {  
10. "I love you");  
11.         result = mTts.setLanguage(Locale.US);  
12.     }  
13.           
14. break;  
15. case 1:  
16.     {  
17. "Je t'aime");  
18.         result = mTts.setLanguage(Locale.FRENCH);  
19.     }  
20. break;  
21. case 2:  
22.     {  
23. "Ich liebe dich");  
24.         result = mTts.setLanguage(Locale.GERMAN);  
25.     }  
26. break;  
27. case 3:  
28.     {  
29. "Ti amo");  
30.         result = mTts.setLanguage(Locale.ITALIAN);  
31.     }  
32. break;  
33. case 4:  
34.     {  
35. "Te quiero");  
36. new Locale("spa", "ESP"));  
37.     }  
38. break;  
39. default:  
40. break;  
41.     }  
42. //设置发音语言  
43. if(result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED)  
44. //判断语言是否可用  
45.     {  
46. "Language is not available");  
47. false);  
48.     }  
49. else  
50.     {  
51. true);  
52.     }  
53. }  
54. public void onNothingSelected(AdapterView<?> arg) {  
55. // TODO Auto-generated method stub  
56.       
57. }  
58. );

在选择不同的 item时,为 inputText

为TTS 引擎设置语言的 API

public int setLanguage ( Locale  loc)

使用Locale 这个表示语言及国家区域的类来设置语言,目前支持 English、 French 、 German 、 Italian 和Spanish 这 5大语言, 返回的结果为

LANG_AVAILABLE ,  LANG_COUNTRY_AVAILABLE ,  LANG_COUNTRY_VAR_AVAILABLE , LANG_MISSING_DATA   和 LANG_NOT_SUPPORTED 。其中 LANG_MISSING_DATA   和LANG_NOT_SUPPORTED

Demo

 

 

图2 

    文章对应的完整代码例子可以在这里下载:

     

注:文章参加“ 首届Google暑期大学生博客分享大赛——2010 Andriod篇”

标签:Engine,TextToSpeech,我爱你,TTS,int,Android,DATA,CHECK
From: https://blog.51cto.com/u_16034393/7016846

相关文章

  • Android TTS学习——保存对你的喜欢(转)
    一. 简单介绍在上一篇里我们介绍了TTS提供的接口 OnUtteranceCompletedListener 的使用,这个接口的作用是监听语音片段的朗读,并在语音片段朗读结束后调用其定义的回调函数,在回调函数里可以进行需要的操作。在这一篇里我们介绍一下TTS提供的另一个有用的功能,把合成的语音以音频文......
  • Android13冻结进程分析:如何提高设备性能和用户体验
    Android13冻结进程分析:如何提高设备性能和用户体验本文介绍了Android13中的冻结进程功能,它是一种重要的资源管理策略,可以提高系统性能和稳定性,同时最大限度地节省设备的资源和电池消耗。文章讨论了如何合理分配资源,包括CPU、内存等,以提高设备性能和用户体验。此外,文章还提到了......
  • Android平台GB28181设备接入端如何实现多视频通道接入?
    技术背景我们在设计Android平台GB28181设备接入模块的时候,有这样的场景诉求,一个设备可能需要多个通道,常见的场景,比如车载终端,一台设备,可能需要接入多个摄像头,那么这台车载终端设备可以作为主设备,然后,主设备下,配置多个通道,听起来是不是有点儿类似于DVR或NVR?技术实现这里,我们说下,我们......
  • AutoX——当Android中clickable属性显示为false,实际可点击的布局如何处理
    前言最近在写一个关于某音的脚本,包含刷视频/点赞/收藏/分享/评论等一些列功能,借助于AutoX来实现,虽然我老早就买了AutoJsPro但是最新版本阉割的有点厉害。。。内容思索很简单就是,找到布局后,获取坐标信息,使用click去触发;varbtn=className("android.widget.TextView").t......
  • Android build.gradle 基本规则
    Androidbuild.gradle基本规则一个完整示例://此乃本脚本执行所需依赖,以下分别对应maven库和插件buildscript{repositories{//从AndroidStudio3.0后新增了google()配置,可以引用google上的开源项目google()mavenCentral()//......
  • Android之Spinner用法,key/value模式
    参考:http://www.dedeyun.com/it/m/98498.htmlhttps://blog.csdn.net/myxiaoq/article/details/258696931.key、value类,需要重写toString()方法,返回text就是Spinner要显示的keypackagecom.jay.common;publicclassSpinnerData{privateStringvalue="";private......
  • Android开发 Jetpack compose LazyColumn 与 LazyRow、LazyVerticalGrid、LazyHorizon
    前言  此篇博客讲解LazyColumn与LazyRow、LazyVerticalGrid、LazyHorizontalGrid,在compose里LazyColumn与LazyRow与是用来延迟加载数据的,它对标原来xml里的ListView与RecyclerView。LazyColumn纵向列表效果图代码@ComposablefunAPage(){vallistData=remembe......
  • android 对话框AlertDialog。
    API:java.lang.Object ↳ android.app.AlertDialog.Builder使用AlertDialog.Builder创建对话框需要了解以下几个方法:setTitle:为对话框设置标题setIcon:为对话框设置图标setMessage:为对话框设置内容setView:给对话框设置自定义样式setItems:设置对话框要显示的一个list,一般用......
  • android 导出带数据库文件的APK
    http://www.ophonesdn.com/article/show/111技术文章基于OPhoneSDK1.5的英文电子词典的实现基于OPhoneSDK1.5的英文电子词典的实现OPhone平台开发,2009-12-0711:06:42标签:OPhoneSDK1.5英文词典英文词典是手机中经常使用的应用。因此,在本文将......
  • Android Service生命周期及用法!(转)
    AndroidService生命周期及用法!大家好,上一节我讲解了AndroidActivity的生命周期,这一节我将讲解一下Service,首先我们要知道Service具体是干什么的,什么时候用到?以及它的生命周期等。Service概念及用途:Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在......