vs2022生成的默认项目代码使用了屏幕阅读器,然而完全无用,真是搞笑。

        正确的做法是使用文本转语音功能。

目录

一、VS2022默认MAUI项目

二、SemanticScreenReader

三、屏幕阅读无效

四、文本转语音有效


一、VS2022默认MAUI项目

        Visual Studio 2022 MAUI项目默认的代码是个按钮,按钮处理代码是这样的:

		private void OnCounterClicked(object sender, EventArgs e)
		{
			count++;

			if (count == 1)
				CounterBtn.Text = $"Clicked {count} time";
			else
				CounterBtn.Text = $"Clicked {count} times";

			SemanticScreenReader.Announce(CounterBtn.Text);
		}

        代码很简单,前面是修改按钮上的文本,最后一句是朗读按钮上的文本。

二、SemanticScreenReader

        SemanticScreenReader是屏幕阅读器,Announce就是读出指定的文本。看起来太容易了。能放在初始样板代码里的,能不简单吗?

三、屏幕阅读无效

        然而,这句话从来没有工作过!在widdows和安卓都不行!实体机和模拟器都不行!iOS还没试,估计也不行。

        究竟怎么回事呢?原来,屏幕阅读器是个系统功能,属于“辅助功能”,在Windows上叫做“讲述人”,在安卓上叫做“TalkBack”,为了使用上面那句功能,必须首先打开这个辅助功能,然后才能朗读。可是,打开这个功能后,会自动朗读所有点击到的内容,而不仅仅是我们希望朗读的,更恶心的是,打开这个功能后界面操作也变了,必须要学习一套复杂的操作方式才能使用,想退出都不知道怎么退出。

        为什么不是一个悬浮图标,点一下图标再点一下屏幕才朗读呢?

        所以这行代码看起来简单强大其实毫无价值啊!

四、文本转语音有效

        真正用来朗读的功能叫“文本转语音”,其实也一样简单,核心代码就一句:

TextToSpeech.Default.SpeakAsync(文本);

        上面这一句就能朗读文本,实测在windows和安卓上都不需要额外处理。

        改过的代码:

		private void OnCounterClicked(object sender, EventArgs e)
		{
			count++;

			if (count == 1)
				CounterBtn.Text = $"Clicked {count} time";
			else
				CounterBtn.Text = $"Clicked {count} times";

			//SemanticScreenReader.Announce(CounterBtn.Text);
			_= TextToSpeech.Default.SpeakAsync(CounterBtn.Text);
		}

        不过,官方文档(文本转语音 - .NET MAUI | Microsoft Learn)说安卓需要设置(iOS和Windows不需要设置):

        这段代码是:

<queries>
  <intent>
    <action android:name="android.intent.action.TTS_SERVICE" />
  </intent>
</queries>

        默认项目的设置是:

        或许是目标版本比较低的原因吧。


(这里是文档结束)

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐