这是indexloc提供的服务,不要输入任何密码
Skip to content

Commit 99080ba

Browse files
Fixed: Fix NullPointerException when running bell/vibrate on Samsung devices on android 8 and handled deprecated code
Apparently occurs on only Samsung android 8 devices and there is no fix for vibrator except catching the exception so that app doesn't crash. https://gitlab.com/juanitobananas/wave-up/-/issues/131 overbound/SonicTimeTwisted#131 https://web.archive.org/web/20201114040257/https://www.badlogicgames.com/forum/viewtopic.php?t=28507 ``` java.lang.NullPointerException: Attempt to read from field 'android.os.VibrationEffect com.android.server.VibratorService$Vibration.mEffect' on a null object reference at android.os.Parcel.readException(Parcel.java:2035) at android.os.Parcel.readException(Parcel.java:1975) at android.os.IVibratorService$Stub$Proxy.vibrate(IVibratorService.java:292) at android.os.SystemVibrator.vibrate(SystemVibrator.java:81) at android.os.Vibrator.vibrate(Vibrator.java:191) at android.os.Vibrator.vibrate(Vibrator.java:110) at android.os.Vibrator.vibrate(Vibrator.java:89) at com.termux.app.terminal.io.BellHandler$1.run(BellHandler.java:37) at com.termux.app.terminal.io.BellHandler.doBell(BellHandler.java:55) at com.termux.app.terminal.TermuxTerminalSessionClient.onBell(TermuxTerminalSessionClient.java:178) at com.termux.terminal.TerminalSession.onBell(TerminalSession.java:278) ```
1 parent 916f321 commit 99080ba

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

app/src/main/java/com/termux/api/apis/VibrateAPI.java

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
import android.content.Context;
44
import android.content.Intent;
55
import android.media.AudioManager;
6+
import android.os.Build;
7+
import android.os.VibrationEffect;
68
import android.os.Vibrator;
79

810
import com.termux.api.TermuxApiReceiver;
@@ -16,16 +18,34 @@ public class VibrateAPI {
1618
public static void onReceive(TermuxApiReceiver apiReceiver, Context context, Intent intent) {
1719
Logger.logDebug(LOG_TAG, "onReceive");
1820

19-
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
20-
int milliseconds = intent.getIntExtra("duration_ms", 1000);
21-
boolean force = intent.getBooleanExtra("force", false);
22-
23-
AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
24-
if (am.getRingerMode() == AudioManager.RINGER_MODE_SILENT && !force) {
25-
// Not vibrating since in silent mode and -f/--force option not used.
26-
} else {
27-
vibrator.vibrate(milliseconds);
28-
}
21+
new Thread() {
22+
@Override
23+
public void run() {
24+
Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE);
25+
int milliseconds = intent.getIntExtra("duration_ms", 1000);
26+
boolean force = intent.getBooleanExtra("force", false);
27+
28+
AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
29+
if (am == null) {
30+
Logger.logError(LOG_TAG, "Audio service null");
31+
return;
32+
}
33+
// Do not vibrate if in silent mode and -f/--force option is not used.
34+
if (am.getRingerMode() != AudioManager.RINGER_MODE_SILENT || force) {
35+
try {
36+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
37+
vibrator.vibrate(VibrationEffect.createOneShot(milliseconds, VibrationEffect.DEFAULT_AMPLITUDE));
38+
} else {
39+
vibrator.vibrate(milliseconds);
40+
}
41+
} catch (Exception e) {
42+
// Issue on samsung devices on android 8
43+
// java.lang.NullPointerException: Attempt to read from field 'android.os.VibrationEffect com.android.server.VibratorService$Vibration.mEffect' on a null object reference
44+
Logger.logStackTraceWithMessage(LOG_TAG, "Failed to run vibrator", e);
45+
}
46+
}
47+
}
48+
}.start();
2949

3050
ResultReturner.noteDone(apiReceiver, intent);
3151
}

0 commit comments

Comments
 (0)