以编程方式启用/禁用键盘声和振动。

9

我正在寻找一种方法来禁用和启用按键时的键盘声音和振动。我已经在Stack Overflow和其他Android论坛上搜索过,但没有找到任何结果。

我已尝试使用AudioManager启用振动模式,但我想要在键盘上同时激活振动模式和声音。

audioManager.setRingerMode(AudioManager.RINGER_MODE_VIBRATE);
audioManager.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER, 
                AudioManager.VIBRATE_SETTING_ON);

有没有办法更改键盘声音和振动的android.provider.Settings

我想这取决于键盘的实现方式。可能有一些键盘在每次按键时都会播放电影。我认为你无法实现这个功能。不管怎样,祝你好运。 - Sherif elKhatib
1
将手机设置为静音模式有用吗?这在很大程度上取决于您所使用的应用程序类型。但你可以这样做:AudioManager audio_mngr = (AudioManager) getBaseContext().getSystemService(Context.AUDIO_SERVICE); 然后 audio_mngr .setRingerMode(AudioManager.RINGER_MODE_SILENT); - Ali
1
不,这并没有帮助@Ali,我已经尝试过了,我想让铃声和媒体音量保持正常,只禁用或启用键盘敲击声和振动。 - Houcine
你是在谈论一个特定的键盘吗?还是想要控制用户设备上安装的任何键盘? - ozbek
1
我在谈论Android中的默认键盘,我想要能够在用户按下键盘上的键时禁用/启用键盘声音和振动(就像键盘设置中一样)。 - Houcine
显示剩余4条评论
3个回答

11

查看如何禁用所有应用或活动的默认声音效果以停用轻击声。

要编程地禁用触觉反馈和触摸声,请参考http://developer.android.com/reference/android/view/View.html#setHapticFeedbackEnabled(boolean) http://developer.android.com/reference/android/view/View.html#setSoundEffectsEnabled(boolean)

更简单的方法是在styles.xml中定义以下内容:

<!-- Application theme. -->
<style name="AppTheme" parent="@android:style/Theme.NoTitleBar.Fullscreen">
    <item name="android:soundEffectsEnabled">false</item>
    <item name="android:hapticFeedbackEnabled">false</item>
</style>

在您的manifest.xml文件中

<application [...] android:theme="@style/AppTheme" >

这是关于编程的内容,不是关于键盘按键的。 - Houcine
你能解释一下“键盘按键”是什么意思吗?你是指软键盘(显示在屏幕上的),还是硬键盘(例如连接到ASUS Transformer-Pad上的)?所以,当用户使用键盘时,你想要关闭触觉反馈和声音吗? - Alexander Pacha
我在谈论软键盘,例如三星Galaxy S2,HTC ONE等。 - Houcine
那么您可能需要一个肮脏的黑客技巧(仅适用于已root的设备),如https://dev59.com/LVvUa4cB1Zd3GeqPrDKG中所述。 - Alexander Pacha

4
根据您的评论: 我在谈论Android中的默认键盘,我希望能够在用户按下键盘时禁用/启用键盘声音和振动(就像键盘设置中一样)。

&

我在谈论软键盘,就像三星GALAXY S2、HTC ONE等设备上的软键盘一样。
据我所知,你无法完成这个任务,因为每种输入方法都会在内部保留其声音/振动偏好值。例如,请参见Android (AOSP) IMe(截至本文撰写时的30~39行)。
    <CheckBoxPreference
        android:key="vibrate_on"
        android:title="@string/vibrate_on_keypress"
        android:defaultValue="@bool/config_default_vibration_enabled"
        android:persistent="true" />
    <CheckBoxPreference
        android:key="sound_on"
        android:title="@string/sound_on_keypress"
        android:defaultValue="@bool/config_default_sound_enabled"
        android:persistent="true" />

正如您所看到的,它将振动/声音值存储在其共享首选项中。这适用于市场上大多数输入法。因此,您无法从单一点控制所有输入法的振动/声音效果。

你能解释一下吗?我不明白在哪里以及如何实现这个。@ozbek - Upendra Shah
@UpendraShah,你在开发输入法吗? - ozbek
实际上,我想从我的应用程序中处理按键振动和按键声音,因此我想以编程方式启用或禁用它们。 - Upendra Shah
@UpendraShah:正如答案中所提到的,目前这是不可能的。 - ozbek
如果我获得设备的 root 访问权限,这是可能的吗?@ozbek - Upendra Shah
显示剩余2条评论

0

是的,如果您拥有root访问权限,您可以这样做。这是一个冗长的过程,但您可以这样做:

步骤:1 创建名为com.android.inputmethod.latin_preferences.xml的xml文件并保存在资产中。

com.android.inputmethod.latin_preferences.xml

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
    <boolean name="popup_on" value="false" />
    <string name="auto_correction_threshold">1</string>
    <boolean name="pref_enable_metrics_logging" value="true" />
    <boolean name="pref_voice_input_key" value="true" />
    <boolean name="pref_key_use_personalized_dicts" value="true" />
    <boolean name="pref_key_block_potentially_offensive" value="true" />
    <int name="last_shown_emoji_category_id" value="1" />
    <boolean name="sound_on" value="false" />
    <string name="emoji_recent_keys">[{&quot;Integer&quot;:128533}]</string>
    <boolean name="auto_cap" value="true" />
    <boolean name="show_suggestions" value="true" />
    <boolean name="pref_key_use_contacts_dict" value="true" />
    <boolean name="next_word_prediction" value="true" />
    <boolean name="pref_key_use_double_space_period" value="true" />
    <int name="emoji_category_last_typed_id1" value="0" />
    <boolean name="vibrate_on" value="false" />
</map>

步骤2:使用asset manager将此文件复制到您的应用程序文件夹中(任何您可以访问的地方)需要以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

此函数将从资产中复制文件

public static void copyAssets(Context context, String assetPath, String outFilename) {
        AssetManager assetManager = context.getAssets();
        InputStream in = null;
        OutputStream out = null;
        try {
            in = assetManager.open(assetPath);
            File outFile = new File(context.getExternalFilesDir(null), outFilename);

            out = new FileOutputStream(outFile);
            copyFile(in, out);
        } catch (IOException e) {
            Log.e(TAG, "Failed to copy asset: " + outFilename, e);
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                }
            }
        }
    }

public static void copyFile(InputStream in, OutputStream out) throws IOException {
        byte[] buffer = new byte[1024];
        int read;
        while ((read = in.read(buffer)) != -1) {
            out.write(buffer, 0, read);
        }
    }

步骤三:覆盖系统偏好设置文件系统路径(destPath)为/data/data/com.android.inputmethod.latin/shared_prefs

public static void copyToSystem(final String sourceFilePath, final String destPath) {
        Thread background = new Thread(new Runnable() {

            @Override
            public void run() {
                try {
                    Process process = Runtime.getRuntime().exec("su");
                    DataOutputStream os = new DataOutputStream(process.getOutputStream());
//                    
                    os.writeBytes("cp -f " + sourceFilePath + " " + destPath + "\n");
                    os.flush();
                    os.writeBytes("exit\n");
                    os.flush();
                    process.waitFor();
                    process.waitFor();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                    Log.e(TAG, e.toString());
                } catch (IOException e) {
                    e.printStackTrace();
                    Log.e(TAG, e.toString());
                }
            }
        });
        background.start();
    }

步骤4:重新启动设备

所有步骤都完成了。这些步骤将关闭按键声音和按键振动。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接