2013-05-06 4 views
8

Я пытаюсь найти способ отключить и включить звук и вибрацию клавиатуры при нажатии клавиш. Я искал на Переполнение стека и другие Android-форумы, но я не нашел никакого результата.включить/отключить звук клавиатуры и вибрацию программно

Я пробовал AudioManager, чтобы включить виброзвонок, но я хочу активировать виброзвонок и звук на клавиатуре.

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

Есть ли способ, как изменить android.provider.Settings для звука клавиатуры и вибрации?

+0

любые идеи ?????! – Houcine

+0

Я думаю, это действительно зависит от реализации Клавиатуры. Там могут быть клавиатуры, которые воспроизводят фильм каждый раз при нажатии клавиши. Я не думаю, что вы можете это достичь. Во всяком случае, goodluck. –

+0

благодарит @SherifelKhatib за ваш ответ, но в настройках у нас есть возможность включить/отключить звук нажатия клавиш и вибратор нажатия клавиш, мой вопрос: есть ли способ сделать это программно, как мы можем это сделать с помощью Wifi через 'WifiManager' и' Brightness', Volume через 'AudioManager'..etc – Houcine

ответ

4

В соответствии с вашими комментариями:

я говорю о клавиатуре по умолчанию в Android, я хочу, чтобы иметь возможность отключить/включить звук клавиатуры и вибрацию, когда пользователь нажмите клавишу на клавиатуре, (например, в настройках клавиатуры)

&

я говорю о мягкой клавиатуре, как в Samsung Galaxy S2, HTC ONE ... и т.д.

AFAIK, вы не можете АККО mplish this, так как каждый метод ввода сохраняет свои значения предпочтений звука/вибрации внутри. Смотрите, например 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" /> 

Как вы можете видеть, что сохраняет вибрируют/звуковые значения в ее общей предпочтительности. Это относится к большинству IMe на рынке. Следовательно, вы не можете контролировать вибрационный/звуковой эффект для всех IMe из одной точки.

+0

Можете ли вы это объяснить? Я не могу понять, где и как это реализовать. @ozbek –

+0

@UpendraShah, вы разрабатываете IME? – ozbek

+0

На самом деле я хочу обрабатывать vibrate_on_keypress и sound_on_keypress из своего приложения, поэтому я хочу включить или отключить их прагматично. –

9

Посмотрите на How to disable default sound effects for all my application or activity для отключения звуков нажатия.

Чтобы отключить тактильную обратную связь и осязание звуков программно взглянуть на 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" > 
+0

Это не для клавиш клавиатуры, – Houcine

+0

Не могли бы вы объяснить «клавиатурные клавиши»? Вы имеете в виду мягкую клавиатуру (которая отображается на экране) или жесткую клавиатуру (например, прикрепленную к ASUS Transformer-Pad). Итак, вы хотите отключить тактильную обратную связь и звуки, когда пользователь использует клавиатуру? –

+0

Я говорю о мягкой клавиатуре, например, в SAMSUNG GALAXY S2, HTC ONE ... и т. Д. – Houcine

0

Да, вы можете сделать это, если у вас есть root-доступ. Это длительный процесс, но вы можете сделать это:

Шаг: 1 Создайте файл xml с именем com.android.inputmethod.latin_preferences.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); 
     } 
    } 

Шаг 3: перезапись путь файловой системы системы преференций (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: Перезагрузка устройства

Это все сделано. На этом шаге отключится звук нажатия клавиши и нажата вибрация клавиши