Android App Play sound when holding down a button - android

new android dev hopeful here. I've been attempting to implement an app that, upon holding down the "ok" button, it will play the default ringtone in a loop.
What I have so far
package com.tick.helloAndroid;
import net.technologichron.android.control.NumberPicker;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.media.MediaPlayer;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
//import android.widget.TextView;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.Toast;
public class main extends Activity implements OnTouchListener {
private int REQUEST_ENABLE_BT = 1;
private MediaPlayer mp;
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Set up the window layout
setContentView(R.layout.main);
final Button zero = (Button) this.findViewById(R.id.ok);
zero.setOnTouchListener(this);
Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
mp.setDataSource(this, alert);
}
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mp.setLooping(true);
mp.start();
case MotionEvent.ACTION_UP:
mp.pause();
}
return true;
}
}
From doing some searching on SO, this seems to work for some people, however, the line
mp.setDataSource(this, alert);
seems to not work. By not work, I mean that it forces an "Unhandled Exception Error", which upon doing a try-catch statement,
try {
mp.setDataSource(this, alert);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
Toast.makeText(this, "args", Toast.LENGTH_LONG).show();
finish();
return;
} catch (SecurityException e) {
// TODO Auto-generated catch block
Toast.makeText(this, "sec", Toast.LENGTH_LONG).show();
finish();
return;
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
Toast.makeText(this, "illega", Toast.LENGTH_LONG).show();
finish();
return;
} catch (IOException e) {
// TODO Auto-generated catch block
Toast.makeText(this, "io", Toast.LENGTH_LONG).show();
finish();
return;
}
compiles without any error but crashes when I try to run the app on the android emulator, it does not print any of the above catches' strings.
Any thoughts and ideas about what I have done incorrectly will be most appreciated.
edit: could it be from the fact that the emu does not have a ringtone?

forgot to instantiate mp....hahahahha

Related

Mediaplayer prepare showing Illegal State Exception

I am trying to play an audio file from the internal storage.
The code I used is..
package com.abhi.firstapp.firstapp;
import android.content.Context;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import java.io.File;
import java.io.IOException;
import java.net.URI;
public class MainActivity extends AppCompatActivity {
MediaPlayer mp;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
File f= new File("/sdcard/a.mp3");
if(f.exists())
{
Toast toast= Toast.makeText(this, "file exists", Toast.LENGTH_LONG);
toast.show();
Log.d("uri","1");
Uri uri= Uri.fromFile(f);
Log.d("uri", "2");
mp= new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
Log.d("uri", "3");
try {
mp.setDataSource("/sdcard/a.mp3");
} catch (IOException e) {
e.printStackTrace();
}
//mp.setDataSource(getBaseContext(), uri);
Log.d("uri", "4");
try {
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
Log.d("uri", "IOException");
}
mp.start();
}
else {
Toast toast1 = Toast.makeText(this, "file does not exist", Toast.LENGTH_LONG);
toast1.show();
}
//MediaPlayer mp= MediaPlayer.create(getBaseContext(), uri);
//mp.start();
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
By using the log, I can determine that this code is running till the mp.prepare(mediaplayer prepare). And on this step, it gives the error Illegal State Exception
Caused by: java.lang.IllegalStateException
at android.media.MediaPlayer.prepare(Native Method)
Please Help!
There are a couple of things you might want to change.
First: mp.prepare() will block your main thread, which is forbidden and will result in an exception where Android will close your app. To prevent this, mp.prepareAsync was designed. Use that method instead and implement both an onPreparedListener and an onErrorListener.
Second: you should provide a datasource before you call prepare().
You could do this for example this way:
public class MainActivity extends AppCompatActivity implements MediaPlayer.OnPreparedListener, MediaPlayer.OnErrorListener {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
MediaPlayer mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
try {
mediaPlayer.setDataSource(streamURL);
} catch (IOException e) {
// Error, do something
}
mp.prepareAsync();
...
}
#Override
public void onPrepared(MediaPlayer player) {
mediaPlayer.start();
}
...
}
I had the same problem. It can be raised because MediaPlayer is already prepared. When you create a new MediaPlayer by MediaPlayer mp = MediaPlayer.create(getContext(),someUri); mp prepares automatically so you should not prepare it by yourself.

Streaming Audio Android app doesn't works on Galaxy S4

I've created an app (radio streaming) but doesn't works on S4.
I've tested this app on my Galaxy Nexus, Xperia Arc s, Htc Desire and it works properly.
I think there is an error in my code.
My code:
package com.dieesoft.radiolluvia;
import java.io.IOException;
import android.R.array;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.media.MediaPlayer.TrackInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.Toast;
public class MainActivity extends Activity implements OnClickListener {
private MediaPlayer mp;
private ProgressDialog pb;
private Button bplay;
private Button bstop;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bplay = (Button) findViewById(R.id.button1);
bstop = (Button) findViewById(R.id.button2);
mp = new MediaPlayer();
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
bplay.setOnClickListener(this);
bstop.setOnClickListener(this);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v.getId() == R.id.button1 )
{
//button play
new iniciarStreaming().execute();
Toast.makeText(this, "Play", Toast.LENGTH_SHORT).show();
}
else if(v.getId() == R.id.button2)
{
//button stop
Toast.makeText(this, "Stop", Toast.LENGTH_SHORT).show();
mp.stop();
}
}
private class iniciarStreaming extends AsyncTask<Void, Void, Boolean> implements OnPreparedListener
{
#Override
protected Boolean doInBackground(Void... params) {
// TODO Auto-generated method stub
try {
mp.setDataSource("http://makrodigital.com:8134/radiolluvia");
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mp.prepareAsync();
mp.setOnPreparedListener(this);
return null;
}
protected void onPreExecute() {
// TODO Auto-generated method stub
pb = new ProgressDialog(MainActivity.this);
pb.setMessage("Buffering...");
pb.show();
}
#Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
if (pb.isShowing()) {
pb.cancel();
}
mp.start();
}
}
Your streaming url (http://makrodigital.com:8134/radiolluvia) has AAC format with content-type: audio/aacp.
But audio/aacp streaming is not supported directly. Maybe previously was another link? MP3 or something else?
For playing this url you can use this library:
http://code.google.com/p/aacplayer-android/

Playing media files in another activity

I have retrieved the songs present on my phone and when I click on the list item it switches to the next activity and plays the song.
But when I go back to my playlist and click again on another song, the previous song is still being played as well as the song I just clicked.
Here is the code of Playlist.java:
package com.example.padyplayer;
import java.io.IOException;
import java.util.ArrayList;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class Playlist extends Activity implements OnItemClickListener {
ListView tracks_view;
ArrayList<String> songs;
ArrayAdapter<String> songs_items;
//MediaPlayer mediaplayer;
//AudioManager audiomanager;
Cursor cursor;
Uri uri;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_playlist);
tracks_view = (ListView) findViewById(R.id.tracks);
generate_Playlist();
songs_items = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, songs);
//mediaplayer = new MediaPlayer();
//audiomanager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
tracks_view.setAdapter(songs_items);
tracks_view.setOnItemClickListener(this);
}
#SuppressWarnings("deprecation")
private void generate_Playlist() {
// TODO Auto-generated method stub
uri = android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String projection[] = { android.provider.MediaStore.Audio.Media.DATA,
android.provider.MediaStore.Audio.Media.TITLE,
android.provider.MediaStore.Audio.Media.ARTIST,
android.provider.MediaStore.Audio.Media.ALBUM,
android.provider.MediaStore.Audio.Media.DURATION };
cursor=this.managedQuery(uri, projection, null, null, null);
songs=new ArrayList<String>();
while(cursor.moveToNext())
{
songs.add(cursor.getString(1));
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.playlist, menu);
return true;
}
#Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {
// TODO Auto-generated method stub
//cursor.moveToPosition(position);
int index1=position;
Intent i=new Intent(getApplicationContext(),Controls.class);
i.putExtra("index", index1);
startActivity(i);
}
}
Here is the second class Controls.java:
package com.example.padyplayer;
import java.io.IOException;
import java.util.ArrayList;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class Controls extends Activity implements OnClickListener {
TextView song_view,artist_view;
Button play,next,back;
MediaPlayer mediaplayer=new MediaPlayer();
AudioManager audiomanager;
ArrayList<String> songs;
Cursor cursor;
Uri uri;
private int index=0;
//ArrayAdapter<String> song_items;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_controls);
play=(Button)findViewById(R.id.play);
next=(Button)findViewById(R.id.next);
back=(Button)findViewById(R.id.back);
play.setOnClickListener(this);
next.setOnClickListener(this);
back.setOnClickListener(this);
//mediaplayer=new MediaPlayer();
audiomanager=(AudioManager)getSystemService(Context.AUDIO_SERVICE);
getMusic();
Bundle b=getIntent().getExtras();
index = b.getInt("index");
playSong(index);
}
#SuppressWarnings("deprecation")
private void getMusic() {
// TODO Auto-generated method stub
uri=android.provider.MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
String projection[]={android.provider.MediaStore.Audio.Media.DATA,
android.provider.MediaStore.Audio.Media.TITLE,
android.provider.MediaStore.Audio.Media.ARTIST,
android.provider.MediaStore.Audio.Media.ALBUM,
android.provider.MediaStore.Audio.Media.DURATION};
cursor=this.managedQuery(uri, projection, null, null,null);
songs=new ArrayList<String>();
while (cursor.moveToNext()) {
songs.add(cursor.getString(1));
}
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.controls, menu);
return true;
}
#Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.play:
if(mediaplayer.isPlaying())
{
mediaplayer.pause();
play.setText("play");
}
else if(mediaplayer!=null)
{
mediaplayer.start();
play.setText("pause");
}
break;
case R.id.next:
if(index<(songs.size()-1)){
index+=1;
playSong(index);
}
else
{
index=0;
playSong(index);
}
break;
case R.id.back:
if(index>0){
index-=1;
playSong(index);
}
else
{
index=songs.size()-1;
playSong(index);
}
break;
default:
break;
}
//
}
private void playSong(int index2) {
// TODO Auto-generated method stub
cursor.moveToPosition(index2);
int song_id=cursor.getColumnIndex(MediaStore.Audio.Media.DATA);
String song_name=cursor.getString(song_id);
try {
mediaplayer.reset();
mediaplayer.setDataSource(song_name);
mediaplayer.prepare();
mediaplayer.start();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
I'm stuck with this problem since two days. Please help.
My advice: use a Service to host the MediaPlayer and have your Activities communicate with the Service to play and stop songs. Don't forget to call release on the MediaPlayer when you are done (if you use a new player for the next song).
Edit:
The Activity is not going to be the same instance each time it opens, and you create a new MediaPlayer each time an instance of the Activity is created. Underneath the hood, there is a native object actually playing the music that is not intrinsically tied to the life cycle of the Activity, and you aren't calling stop or pause anywhere that would get called when Activities are changed. You could potentially stop and release the MediaPlayer in an appropriate callback (onPause or onDestroy), but that will prevent you from playing music continuously. If you insist on using an Activity to host the MediaPlayer, then music playback has to be completely integrated into the life cycle of the Activity. When the Activity is changed, you need to stop and release its resources explicitly. If you put it in a Service, you won't have that limitation. You can manage one or more MediaPlayers (note the setNextMediaPlayer method) without them being tied to any particular Activity.
it will keep playing. You need to free your media player object when you press back button. In onPause(), release your media player object otherwise it will keep playing.
To implement music player, you can refer open source code. Refer VLC player source code.
before start playing song every time mMediaPlayer.reset() from that you can play new song every time or check if mediaplayer is playing or not if playing stop it

Cannot able to access MediaController Field using Reflection

I am trying to change Visibility of FastForward Button present in MediaController Class using concept of Reflection.
Below is my code snippet.
package com.example.reflection;
import java.lang.reflect.Field;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.view.View;
import android.widget.ImageButton;
import android.widget.MediaController;
import android.widget.Toast;
import android.widget.VideoView;
public class MainActivity extends Activity {
private VideoView videoView;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Class <? > aClass;
try {
MediaController controller = new MediaController(this);
aClass = Class.forName("android.widget.MediaController");
Field forwardButton = aClass.getDeclaredField("mFfwdButton");
forwardButton.setAccessible(true);
NPE--->> ImageButton button = (ImageButton) forwardButton.get(controller);
if (null == button) Toast.makeText(this, "Button is null", Toast.LENGTH_LONG)
.show();
else button.setVisibility(View.INVISIBLE);
videoView = (VideoView) findViewById(R.id.videoView);
videoView.setVideoPath(Environment.getExternalStorageDirectory() + "/Video/NeYo.flv");
videoView.setMediaController(controller);
videoView.requestFocus();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
I get NullPointerException while fetching ImageButton.
Can somebody please point out the error I am making?
Thanks
Anyways I got the answer for this question.
mFfwdButton is instantiated only when the View is inflated. Thats why I was getting a null. I was trying to get the variable even before MediaController has been attached to VideoView.
I followed following approach and it worked.It may not be best practice in production environment,but below snippet worked for me.
#Override
protected void onResume() {
new Handler().postDelayed(new Runnable() {
#Override
public void run() {
ImageButton button;
try {
button = (ImageButton) forwardButton.get(controller);
if (null == button) Toast.makeText(MainActivity.this, "Button is null",
Toast.LENGTH_LONG).show();
else button.setVisibility(View.INVISIBLE);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}, 50);
super.onResume();
}
mFfwdButton is instantiated only when the View is inflated. So you are getting a null. So i guess you cannot use it until the activity has been shown to the user. You are trying to get the variable even before mediacontroller has been attached to VideoView
Try posting a runnable with a delay in OnResume

Play mp3 file from raw resource on click of a TextView

I want to play a certain mp3 file when a text is clicked. For example, I clicked the word "Nicholas", the app have to play nicholas.mp3.
Sorry for my messy code, I'm new to android dev:
package com.example.playword;
import java.io.IOException;
import android.app.Activity;
import android.media.MediaPlayer;
import android.os.Bundle;
//import android.os.Handler;
import android.view.View;
//import android.view.View.OnClickListener;
//import android.widget.Button;
import android.widget.TextView;
public class PlayWord extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//final Handler mHandler = new Handler();
final TextView nicholas = (TextView) findViewById(R.id.nicholas);
final TextView was = (TextView) findViewById(R.id.was);
nicholas.setText("Nicholas ");
was.setText("was ");
/*
Button btn = (Button) (findViewById(R.id.nicholasBtn));
btn.setOnClickListener(new OnClickListener(){
#Override
public void onClick(View v) {
nicholas.setText("Nicholas (Clicked!) ");
}
});
*/
View.OnClickListener handler = new View.OnClickListener(){
public void onClick(View v) {
switch (v.getId()) {
case R.id.nicholas: // doStuff
MediaPlayer mPlayer = MediaPlayer.create(null, R.raw.aaanicholas);
try {
mPlayer.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mPlayer.start();
nicholas.setText("Nicholas (Clicked!) ");
break;
case R.id.was: // doStuff
MediaPlayer mPlayer1 = MediaPlayer.create(null, R.raw.aaawas);
try {
mPlayer1.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
mPlayer1.start();
was.setText("was (Clicked!) ");
break;
}
}
};
findViewById(R.id.nicholas).setOnClickListener(handler);
findViewById(R.id.was).setOnClickListener(handler);
}
}
When I run this, I'm getting a force close error. Do you have a much better idea on this?
You need to pass in a context instance into MediaPlayer.create method:
MediaPlayer mPlayer = MediaPlayer.create(PlayWorld.this, R.raw.aaanicholas);
Also, after the create() call, prepare is already executed, so you don't need to execute it explicitly, just invoke start() right after create().
When you create the mPlayer object you should pass it the Context, which is in your case PlayWord.this.
MediaPlayer mPlayer = MediaPlayer.create(FakeCallScreen.this, R.raw.mysoundfile);
mPlayer.start();
val mediaPlayer = MediaPlayer.create(this,R.raw.music)
mediaPlayer.isLooping=true
mediaPlayer.start()
music_on_off_button.setOnClickListener {
if (mediaPlayer.isPlaying){
mediaPlayer.pause()
}else{
mediaPlayer.start()
}
}
You can detect weather the music is playing or not by using isPlaying() method

Categories

Resources