Ich erstelle eine benutzerdefinierte Tastatur für Android. Auf Tastendruck meiner Tastatur, was ich will, ist Vibration auf der Hand wie Android-Soft-Tastatur. Ich habe sogar auf diese Antwort enable/disable keyboard sound and vibration programmatically hingewiesen, aber ich konnte nicht verstehen, wie man es benutzt. Kann jemand erklären, wie man diese Eigenschaft in meiner kundenspezifischen Tastaturanwendung erhält?Vibration auf Tastendruck in android Soft-Tastatur
Antwort
Vergessen Sie nicht, Vibrationen in Ihr Manifest aufzunehmen.
Ja, Sie können dies tun, wenn Sie Root-Zugang haben. Es ist ein langwieriger Prozess, aber Sie können dies tun:
Schritt: 1 Erstellen Sie XML-Datei mit dem Namen com.android.inputmethod.latin_preferences.xml
und in Assets speichern.
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">[{"Integer":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="true" />
</map>
Schritt 2: Kopieren Sie diese Datei in Ihrem Anwendungsordner (überall dort, wo Sie zugreifen können) mit asset manager
für die Sie Datei kopieren müssen
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
diese Funktion aus Vermögenswerte
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);
}
}
Schritt 3: Systemeinstellung Dateisystempfad überschreiben (destPath) ist /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();
}
Schritt 4: Gerät neu starten
Das ist alles fertig ist. In diesem Schritt wird der Ton des Tastendrucks deaktiviert und die Vibration des Geräts aktiviert.