I am new to Android development. I want to make an app that is essentially a music player but the phone can vibrate to the beat of the music playing. I remember the earliest Nokia phones had this feature, I want to recreate this for fun.
My question: is this possible as an Android app? If so, what are the general approaches? Do I have to analyse the sound patterns of the song then alter the vibration intensity?
Thanks!
Tap Settings > Sounds and vibration. Tap Sound mode > Vibrate.
Go into Settings>Accessibility>Hearing and turn off Auto Haptic. The phone vibrates when audio is playing even through bluetooth.
To create sound, you need to make vibrations. We can change the size of these vibrations to make them bigger or smaller. This changes the loudness or volume of the sound. The size of the vibration (also called amplitude) determines the volume.
The ringtone and notification sound volume can't be adjust separately as the Android operating system uses a single volume control for both. If you've increased the ringtone volume and the notification sound seems too loud for you, consider muting the notification sound.
I got interested with this question and after deep research I figured out how to do that. So here we go.
import android.media.MediaPlayer;
import android.os.Vibrator;
private Vibrator vibrator;
private MediaPlayer player;
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
player = MediaPlayer.create(this, R.raw.music);
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
player.start();
//HERE WE WILL START VIBRATION
Button button = (Button) findViewById(R.id.btn);
button.setOnClickListener(this);
}
public void onClick(View v){
player.stop();
vibrator.cancel();
}
This is general approach for playing music and now work tight with the method vibrate();
.
From all of constructors of class Vibrator we need this one:
public void vibrate (long milliseconds, AudioAttributes attributes);
It was added in API 21
As first parameter we can pass the duration of the song and this duration we can get this way (source):
String mediaPath = Uri.parse("android.resource://<your-package-name>/raw/filename").getPath();
MediaMetadataRetriever mmr = new MediaMetadataRetriever();
mmr.setDataSource(mediaPath);
String duration = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION);
As second parameter we need to create AudioAttributes with the help of AudioAttributes.Builder:
vibrator.vibrate(duration, new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build());
Please, NOTE: I haven't tried it. But the doc said it should works fine. Let me know if that is completed way. Best regards.
P.S. Don't forget permission:
<uses-permission android:name="android.permission.VIBRATE" />
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With