Why edittext reload listview? - java

I have edit text in listview and when a edit text is focus it's reload/refresh the listview.
public class MyActivity extends AppCompatActivity {
#Override
protected void onCreate(#Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ListView lv = new ListView(getApplicationContext());
setContentView(lv);
lv.setAdapter(new MyAdapter(getApplicationContext()));
}
}
and :
public class MyAdapter extends BaseAdapter {
private Context context;
public ArrayList myItems = new ArrayList();
public MyAdapter(Context context) {
this.context = context;
for (int i = 0; i < 20; i++) {
LauncherActivity.ListItem listItem = new LauncherActivity.ListItem();
myItems.add(listItem);
}
}
#NonNull
#Override
public View getView(int position, #Nullable View convertView, #NonNull ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(R.layout.temp, null);
return convertView;
}
}
Why it's produce this ?
And How to prevent this ?
09-08 19:38:59.913 14702-14702/com.infinity.passwordmanager W/IInputConnectionWrapper: finishComposingText on inactive InputConnection
09-08 19:39:00.044 14702-14702/com.infinity.passwordmanager W/IInputConnectionWrapper: getExtractedText on inactive InputConnection
09-08 19:39:00.058 14702-14702/com.infinity.passwordmanager W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
09-08 19:39:00.089 14702-14702/com.infinity.passwordmanager W/IInputConnectionWrapper: getExtractedText on inactive InputConnection
09-08 19:39:00.101 14702-14702/com.infinity.passwordmanager W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
09-08 19:39:00.167 14702-14702/com.infinity.passwordmanager W/IInputConnectionWrapper: finishComposingText on inactive InputConnection
09-08 19:39:00.267 14702-14702/com.infinity.passwordmanager W/IInputConnectionWrapper: getExtractedText on inactive InputConnection
09-08 19:39:00.281 14702-14702/com.infinity.passwordmanager W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection

To Log or maybe Toast what happens before or after the view click, implement
LoaderManager.LoaderCallbacks<Cursor>
on your
MyActivity
But first you'll have to extend ListActivity, which isn't an issue since your whole Activity is occupied by a ListView.
This will get you closer to what's wrong since we are limited by the amount of information your Log is posting
https://developer.android.com/guide/topics/ui/layout/listview#java

Related

ViewPostIme pointer 1/0

I have the following code with no compilation errors, just resulting in an infinite loop... I don't get where the problem is.
When I click the Button, I want to create an object using the values entered in the edittexts and pass them to another activity. But instead, I get a loop.
Each spinner is populated using a string-array from resources/strings. I had some difficulties getting the values here, because at the spinner spTipUtilizator when "Profesor" is selected, I want spGrupa to be disabled, and when "Student" is selected, I want spdept to be disabled, but also this doesn't work. And based on that option will be chosen the next activity which will be opened after clicking the button.
Also, why doesn't it work to set the default date in my calendar? I tried multiple things found here, but none of them worked for me. My Android Studio doesn't show DatePicker, which I would prefer, only that Calendar.
public class SignInActivity extends Activity {
private Button bSignup;
private EditText etNume, etPrenume, etUsername, etPassword, etConfirmPass, etEmail;
private RadioButton rbMasc, rbFem;
private Spinner spTipUtilizator, spgrupa, spdept;
private ProgressBar progBar;
private Calendar calendar;
private int year, month, day, currentYear, defday, defmonth, defyear;
private List<String> tipUtilizatorList, grupaList;
private ArrayAdapter<String> spinnerArrayAdapterTipU;
private String nume,prenume,username,password,password2,email,masc,fem,sex,tipUser,dept,DataN;
private int grupa;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
calendar=Calendar.getInstance();
calendar.set(1990,12,12);
bSignup = findViewById(R.id.buttonSignin);
etNume=findViewById(R.id.et_nume);
etPrenume=findViewById(R.id.et_prenume);
etUsername=findViewById(R.id.et_username);
etPassword=findViewById(R.id.et_password);
etConfirmPass = findViewById(R.id.et_confirmpassword);
etEmail=findViewById(R.id.et_email);
rbMasc=findViewById(R.id.radioButtonMasc);
rbFem=findViewById(R.id.radioButtonFem);
spTipUtilizator=findViewById(R.id.spinnerTipUtilizator);
spgrupa=findViewById(R.id.spinnerGrupa);
spdept=findViewById(R.id.spinnerDepartament);
progBar = findViewById(R.id.progressBar);
tipUtilizatorList=new ArrayList<>(Arrays.asList(getResources().getStringArray((R.array.tipUtilizator))));
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,tipUtilizatorList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spTipUtilizator.setAdapter(adapter);
grupaList = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.grupa)));
bSignup.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
nume = etNume.getText().toString().trim();
prenume = etPrenume.getText().toString().trim();
username = etUsername.getText().toString().trim();
password = etPassword.getText().toString().trim();
password2 = etConfirmPass.getText().toString().trim();
email = etEmail.getText().toString().trim();
masc = rbMasc.getText().toString().trim();
fem = rbFem.getText().toString().trim();
sex=fem;
tipUser = spTipUtilizator.getSelectedItem().toString().trim();
grupa = Integer.parseInt(spgrupa.getSelectedItem().toString().trim());
dept = spdept.getSelectedItem().toString().trim();
DataN = day+"/"+month+"/"+year;
progBar.setVisibility(View.VISIBLE);
if(rbFem.isChecked()) {
sex=fem;
}
else if(rbMasc.isChecked()) {
sex=masc;
}
spTipUtilizator.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
#Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String Text = parent.getSelectedItem().toString();
if(Text.equals("Profesor")) {
spgrupa.getSelectedView().setEnabled(false);
spdept.getSelectedView().setEnabled(true);
Intent intent = new Intent(getApplicationContext(),StartProfesorActivity.class);
Profesor prof = new Profesor(nume,prenume,username,password,email,sex,dept,DataN);
intent.putExtra("profesor",prof);
startActivity(intent);
return;
}
else if(Text.equals("Student")) {
spgrupa.getSelectedView().setEnabled(true);
spdept.getSelectedView().setEnabled(false);
Intent intent = new Intent(getApplicationContext(),StartStudentActivity.class);
Student stud = new Student(nume,prenume,username,password,email,sex,grupa, DataN);
intent.putExtra("student",stud);
startActivity(intent);
return;
}
}
#Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
});
}
}
Log:
D/AbsListView: in onLayout changed
D/ViewRootImpl#cab402e[PopupWindow:ad4e773]: MSG_WINDOW_FOCUS_CHANGED 1
V/InputMethodManager: Not IME target window, ignoring
D/ViewRootImpl#cab402e[PopupWindow:ad4e773]: MSG_RESIZED_REPORT: frame=Rect(266, 72 - 422, 1047) ci=Rect(0, 0 - 0, 0) vi=Rect(0, 0 - 0, 0) or=1
D/ViewRootImpl#27d7010[SignInActivity]: MSG_WINDOW_FOCUS_CHANGED 0
D/ViewRootImpl#cab402e[PopupWindow:ad4e773]: ViewPostIme pointer 0
D/ViewRootImpl#cab402e[PopupWindow:ad4e773]: ViewPostIme pointer 1
D/AbsListView: onTouchUp() mTouchMode : 0
D/ViewRootImpl#cab402e[PopupWindow:ad4e773]: Relayout returned: old=[266,72][422,1047] new=[266,72][422,1047] result=0x1 surface={valid=true 481098420224} changed=false
D/ViewRootImpl#27d7010[SignInActivity]: MSG_WINDOW_FOCUS_CHANGED 1
D/ViewRootImpl#cab402e[PopupWindow:ad4e773]: MSG_WINDOW_FOCUS_CHANGED 0
I/zygote64: Compiler allocated 4MB to compile void android.view.View.<init>(android.content.Context, android.util.AttributeSet, int, int)
I/OpenGLRenderer: prepareTree mLayerUpdateQueue is not empty, size = 1
name = PopupWindow$PopupBackgroundView, size (156, 975)
D/OpenGLRenderer: eglDestroySurface = 0x6ff4459d80
endAllActiveAnimators on 0x6ff591ec00 (DropDownListView) with handle 0x7003b6eb00
D/ViewRootImpl#cab402e[PopupWindow:ad4e773]: dispatchDetachedFromWindow
D/InputEventReceiver: channel '468478f PopupWindow:ad4e773 (client)' ~ Disposing input event receiver.
channel '468478f PopupWindow:ad4e773 (client)' ~NativeInputEventReceiver.
D/ViewRootImpl#27d7010[SignInActivity]: ViewPostIme pointer 0
D/ViewRootImpl#27d7010[SignInActivity]: ViewPostIme pointer 1
D/ViewRootImpl#27d7010[SignInActivity]: ViewPostIme pointer 0
D/ViewRootImpl#27d7010[SignInActivity]: ViewPostIme pointer 1
D/ViewRootImpl#27d7010[SignInActivity]: ViewPostIme pointer 0
D/ViewRootImpl#27d7010[SignInActivity]: ViewPostIme pointer 1
D/ViewRootImpl#27d7010[SignInActivity]: ViewPostIme pointer 0
D/ViewRootImpl#27d7010[SignInActivity]: ViewPostIme pointer 1
V/InputMethodManager: Starting input: tba=android.view.inputmethod.EditorInfo#54a19af nm : com.example.ancaa.proiectandroidquiz ic=com.android.internal.widget.EditableInputConnection#ba71bc
I/InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
W/IInputConnectionWrapper: getCursorCapsMode on inactive InputConnection
W/IInputConnectionWrapper: getCursorCapsMode on inactive InputConnection
W/IInputConnectionWrapper: getSelectedText on inactive InputConnection
W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
W/IInputConnectionWrapper: getTextAfterCursor on inactive InputConnection
W/IInputConnectionWrapper: getTextBeforeCursor on inactive InputConnection
D/OpenGLRenderer: eglDestroySurface = 0x7003ab7400
D/ViewRootImpl#27d7010[SignInActivity]: Relayout returned: old=[0,0][1080,1920] new=[0,0][1080,1920] result=0x5 surface={valid=false 0} changed=true
D/ViewRootImpl#27d7010[SignInActivity]: MSG_WINDOW_FOCUS_CHANGED 0
D/ViewRootImpl#27d7010[SignInActivity]: Relayout returned: old=[0,0][1080,1920] new=[0,0][1080,1920] result=0x1 surface={valid=false 0} changed=false
Application terminated.
You shouldn't create the OnItemSelectedListener inside the OnClickListener for your sign in button, instead you have to create it outside and save the selected option in a variable.
Then when the user clicks your sign in button, you check witch option was selected and start the correct Activity.
Looking at your code, you could simply save the intent to the next activity, and when the user clicks the button just start the Activity on that intent.
I've put a check for nullity before trying to start that intent, and you could show the user some dialog or Toast if no valid option was selected.
public class SignInActivity extends Activity {
private Button bSignup;
private EditText etNume, etPrenume, etUsername, etPassword, etConfirmPass, etEmail;
private RadioButton rbMasc, rbFem;
private Spinner spTipUtilizator, spgrupa, spdept;
private ProgressBar progBar;
private Calendar calendar;
private int year, month, day, currentYear, defday, defmonth, defyear;
private List<String> tipUtilizatorList, grupaList;
private ArrayAdapter<String> spinnerArrayAdapterTipU;
private String nume,prenume,username,password,password2,email,masc,fem,sex,tipUser,dept,DataN;
private int grupa;
private Intent activityToStart;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sign_in);
calendar=Calendar.getInstance();
calendar.set(1990,12,12);
bSignup = findViewById(R.id.buttonSignin);
etNume=findViewById(R.id.et_nume);
etPrenume=findViewById(R.id.et_prenume);
etUsername=findViewById(R.id.et_username);
etPassword=findViewById(R.id.et_password);
etConfirmPass = findViewById(R.id.et_confirmpassword);
etEmail=findViewById(R.id.et_email);
rbMasc=findViewById(R.id.radioButtonMasc);
rbFem=findViewById(R.id.radioButtonFem);
spTipUtilizator=findViewById(R.id.spinnerTipUtilizator);
spgrupa=findViewById(R.id.spinnerGrupa);
spdept=findViewById(R.id.spinnerDepartament);
progBar = findViewById(R.id.progressBar);
tipUtilizatorList=new ArrayList<>(Arrays.asList(getResources().getStringArray((R.array.tipUtilizator))));
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item,tipUtilizatorList);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spTipUtilizator.setAdapter(adapter);
grupaList = new ArrayList<>(Arrays.asList(getResources().getStringArray(R.array.grupa)));
bSignup.setOnClickListener(v -> {
nume = etNume.getText().toString().trim();
prenume = etPrenume.getText().toString().trim();
username = etUsername.getText().toString().trim();
password = etPassword.getText().toString().trim();
password2 = etConfirmPass.getText().toString().trim();
email = etEmail.getText().toString().trim();
masc = rbMasc.getText().toString().trim();
fem = rbFem.getText().toString().trim();
sex=fem;
tipUser = spTipUtilizator.getSelectedItem().toString().trim();
grupa = Integer.parseInt(spgrupa.getSelectedItem().toString().trim());
dept = spdept.getSelectedItem().toString().trim();
DataN = day+"/"+month+"/"+year;
progBar.setVisibility(View.VISIBLE);
if(rbFem.isChecked()) {
sex=fem;
}
else if(rbMasc.isChecked()) {
sex=masc;
}
if(activityToStart != null)
startActivity(activityToStart);
});
spTipUtilizator.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
#Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String Text = parent.getSelectedItem().toString();
if(Text.equals("Profesor")) {
spgrupa.getSelectedView().setEnabled(false);
spdept.getSelectedView().setEnabled(true);
activityToStart = new Intent(getApplicationContext(),StartProfesorActivity.class);
Profesor prof = new Profesor(nume,prenume,username,password,email,sex,dept,DataN);
activityToStart.putExtra("profesor",prof);
return;
}
else if(Text.equals("Student")) {
spgrupa.getSelectedView().setEnabled(true);
spdept.getSelectedView().setEnabled(false);
activityToStart = new Intent(getApplicationContext(),StartStudentActivity.class);
Student stud = new Student(nume,prenume,username,password,email,sex,grupa, DataN);
activityToStart.putExtra("student",stud);
return;
}
}
#Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
}
}

Making a smart Android Media Player app using Service, AsyncTask and Thread

First of all:
Sorry if I had misspellings. I'm from Paraguay and I am using Google Translate.
This may seem a little silly, and I'm a perfectionist and like any good developer and designer, do not want bugs in my projects. I am in the process of learning and hope to learn much with you
I have seen media player applications that allow the user to quickly and repeatedly press the play/stop button without killing the application, and that this is still functioning properly, so I read about Services, AsyncTask and Thread. Not only to play the sound in the background but also to not kill my application with UI errors. I have many questions yet.
I wonder if I'm on a good path using the following resource (found online), but I have tried and the application dies when I press for several times the play/stop buttom or sometimes simply not play the song.
package com.myaudioservice.app;
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.IBinder;
/**
* Service to serv MediaPlayer in background
*
* #author Eugeny Pozharsky
*/
public class PlayerService extends Service {
private final IBinder mBinder = new LocalBinder();
private MediaPlayer mediaPlayer;
private PlayerCallback callback;
public class LocalBinder extends Binder {
PlayerService getService() {
return PlayerService.this;
}
}
#Override
public IBinder onBind(Intent intent) {
return mBinder;
}
/**
* Kill MediaPlayer to release resources
*/
#Override
public void onDestroy() {
super.onDestroy();
if (mediaPlayer != null) {
stop();
mediaPlayer.release();
}
}
/**
* Starts playing stream.
* Note that we just start media player and do not obtain real URL of the stream.
* So, URL that will be redirected by server will not work. To make such URLs works, adding
* algorithm to obtain the real URL (f.e., create HttpConnection, connect to the server and
* get real URL from connection).
*
* #param url String with URL of a server to connect
*/
public void start(String url) {
if (mediaPlayer == null) {
mediaPlayer = new MediaPlayer();
}
if (isPlaying()) {
mediaPlayer.stop();
mediaPlayer.reset();
}
new Player().execute(url);
Log.e("PlayerService", "start()");
}
/**
* Stops playing of the stream.
*/
public void stop() {
// stopping MediaPlayer in separate thread because it can take a time
new Thread(new Runnable() {
#Override
public void run() {
if (mediaPlayer != null) {
if (mediaPlayer.isPlaying()) {
mediaPlayer.stop();
}
//mediaPlayer.release();
//mediaPlayer = null;
}
}
}).start();
if (callback != null) {
callback.onStopped();
}
Log.e("PlayerService", "stop()");
}
/**
* Is stream playing?
*
* #return true or false
*/
public Boolean isPlaying() {
return mediaPlayer != null && mediaPlayer.isPlaying();
}
public void setCallback(PlayerCallback callback) {
this.callback = callback;
}
/**
* Background task to start MediaPlayer. It is used because starting playing of remote stream may
* take long time and we must not block UI thread.
* Also, this approach allows to cancel starting process (not implemented in current version)
*/
private class Player extends AsyncTask<String, Void, Void> {
/**
* This function called in UI thread and we callback to activity to update UI elements
*/
#Override
protected void onPreExecute() {
super.onPreExecute();
if (callback != null) {
callback.onPreStart();
}
}
/**
* This function called in UI thread and we callback to activity to update UI elements
*/
#Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (mediaPlayer == null || !mediaPlayer.isPlaying()) {
// Start MediaPlayer fail.
if (callback != null) {
callback.onStartFailed();
}
} else {
if (callback != null) {
callback.onStarted();
}
}
}
/**
* This function called from separate thread and we do long-time operation in it
*
* #param strings params
* #return null
*/
#Override
protected Void doInBackground(String... strings) {
//mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(strings[0]);
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.prepare();
mediaPlayer.start();
} catch (Exception e) {
if (mediaPlayer != null) {
mediaPlayer.release();
}
mediaPlayer = null;
}
return null;
}
}
}
I wonder if I should cancel my AsyncTask process at any time or if I should add/modify something that my application will not die. How should I do?
Someone can guide me?
I usually get the error (if it appears) in my logcast it is as follows:
java.lang.IllegalStateException: Cannot execute task: the task has already been executed (a task can be executed only once)
For the Play/Stop button:
btn_control.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
control((!ON_PLAY) ? 1 : 0);
}
});
private void control(int est) {
if(est==1){
if (!hayConexion()) {
Toast.makeText(Principal.this, getString(R.string.error_conexion_txt), Toast.LENGTH_SHORT).show();
} else {
if (mBound) {
mService.start();
ON_PLAY = true;
}
}
}else if(est==0) {
if (mBound) {
mService.stop();
ON_PLAY = false;
}
}
}
EDIT:
Logcat:
09-08 03:13:08.333 32438-32474/com.myaudioservice.app V/MediaPlayer-JNI﹕ native_setup
09-08 03:13:08.333 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ constructor
09-08 03:13:08.343 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ setListener
09-08 03:13:08.343 32438-32474/com.myaudioservice.app I/MediaPlayer﹕ path is null
09-08 03:13:08.343 32438-32474/com.myaudioservice.app D/MediaPlayer﹕ setDataSource IOException happend :
java.io.FileNotFoundException: No content provider: rtsp://ip/folder/file.stream
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1053)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:907)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:834)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:988)
at android.media.MediaPlayer.setDataSource(MediaPlayer.java:942)
at com.myaudioservice.app.PlayerService$Player.doInBackground(PlayerService.java:156)
at com.myaudioservice.app.PlayerService$Player.doInBackground(PlayerService.java:130)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
09-08 03:13:08.343 32438-32474/com.myaudioservice.app D/MediaPlayer﹕ Couldn't open file on client side, trying server side
09-08 03:13:08.353 32438-32474/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 03:13:08.353 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 03:13:08.353 32438-32474/com.myaudioservice.app D/com.myaudioservice.app.PlayerService﹕ Preparing: rtsp://ip/folder/file.stream
09-08 03:13:08.353 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 03:13:08.353 32438-32474/com.myaudioservice.app V/MediaPlayer﹕ prepare
09-08 03:13:09.384 32438-32438/com.myaudioservice.app E/PlayerService﹕ stop()
09-08 03:13:09.394 32438-32495/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 03:13:09.394 32438-32495/com.myaudioservice.app V/MediaPlayer-JNI﹕ release
09-08 03:13:09.394 32438-32495/com.myaudioservice.app V/MediaPlayer﹕ setListener
09-08 03:13:09.394 32438-32495/com.myaudioservice.app V/MediaPlayer﹕ disconnect
09-08 03:13:09.544 32438-32438/com.myaudioservice.app D/AndroidRuntime﹕ Shutting down VM
09-08 03:13:09.544 32438-32438/com.myaudioservice.app W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x4193eda0)
09-08 03:13:09.544 32438-32438/com.myaudioservice.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.myaudioservice.app, PID: 32438
java.lang.IllegalStateException
at android.media.MediaPlayer.isPlaying(Native Method)
at com.myaudioservice.app.PlayerService.reproduciendo(PlayerService.java:118)
at com.myaudioservice.app.PlayerService.start(PlayerService.java:84)
at com.myaudioservice.app.MainActivity.control(MainActivity.java:298)
at com.myaudioservice.app.MainActivity.access$100(MainActivity.java:38)
at com.myaudioservice.app.MainActivity$1.onClick(MainActivity.java:173)
at android.view.View.performClick(View.java:4640)
at android.view.View$PerformClick.run(View.java:19425)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:146)
at android.app.ActivityThread.main(ActivityThread.java:5593)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1283)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1099)
at dalvik.system.NativeStart.main(Native Method)
NEW LOGCAT:
09-08 14:49:24.360 9651-9651/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.360 9651-9651/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.390 9651-9651/com.myaudioservice.app E/PlayerService﹕ start()
09-08 14:49:24.480 9651-10534/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.480 9651-10534/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.480 9651-10534/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 14:49:24.480 9651-10534/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 14:49:24.490 9651-9651/com.myaudioservice.app E/PlayerService﹕ stop()
09-08 14:49:24.620 9651-9651/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.620 9651-9651/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.650 9651-9651/com.myaudioservice.app E/PlayerService﹕ start()
09-08 14:49:24.770 9651-10535/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.770 9651-10535/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.770 9651-10535/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 14:49:24.770 9651-10535/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 14:49:24.780 9651-9651/com.myaudioservice.app E/PlayerService﹕ stop()
09-08 14:49:24.890 9651-9651/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:24.890 9651-9651/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:24.910 9651-9651/com.myaudioservice.app E/PlayerService﹕ start()
09-08 14:49:25.021 9651-10540/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:25.031 9651-10540/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:25.031 9651-10540/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 14:49:25.031 9651-10540/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 14:49:25.041 9651-9651/com.myaudioservice.app E/PlayerService﹕ stop()
09-08 14:49:25.151 9651-9651/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 14:49:25.151 9651-9651/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 14:49:25.181 9651-9651/com.myaudioservice.app E/PlayerService﹕ start()
EDIT 2:
-----------------------------------------------------------------------
I thought I already had it until I got an bug (just at the end of my service) :(
Edited PlayerService class
package com.myaudioservice.app;
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class PlayerService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnInfoListener, MediaPlayer.OnCompletionListener {
private static final String LOG_TAG = PlayerService.class.getName();
private String URL_STREAM = "rtsp://domain/folder/file.stream";
private MediaPlayer mMediaPlayer = null;
private PlayerCallback callback;
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
PlayerService getService() {
return PlayerService.this;
}
}
#Override
public IBinder onBind(Intent intent) {
return mBinder;
}
#Override
public void onDestroy(){
if (mMediaPlayer != null) {
stop();
mMediaPlayer.release();
mMediaPlayer = null;
}
}
/**
* Starts playing stream.
* Note that we just start media player and do not obtain real URL of the stream.
* So, URL that will be redirected by server will not work. To make such URLs works, adding
* algorithm to obtain the real URL (f.e., create HttpConnection, connect to the server and
* get real URL from connection).
*
* //#param url String with URL of a server to connect
*/
public void start() {
if (mMediaPlayer == null) mMediaPlayer = new MediaPlayer();
if (isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.reset();
}
try {
mMediaPlayer.setDataSource(URL_STREAM);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
if (callback != null) callback.onPreStart();
Log.e(LOG_TAG, "Preparando: " + URL_STREAM);
mMediaPlayer.prepareAsync();
} catch (Exception e) {
if (mMediaPlayer != null) {
mMediaPlayer.reset();
}
Log.e(LOG_TAG, e.toString());
//mMediaPlayer = null;
}
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnInfoListener(this);
mMediaPlayer.setOnCompletionListener(this);
}
#Override
public void onPrepared(MediaPlayer mp) {
mp.start();
Log.e(LOG_TAG, "start()");
}
#Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_ERROR_IO:
case MediaPlayer.MEDIA_ERROR_MALFORMED:
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
case MediaPlayer.MEDIA_ERROR_TIMED_OUT:
case MediaPlayer.MEDIA_ERROR_UNSUPPORTED:
if (mMediaPlayer == null || !mMediaPlayer.isPlaying()) {
// Start MediaPlayer fail.
if (callback != null) callback.onStartFailed();
}
Log.e(LOG_TAG, "Error");
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
if (callback != null) callback.onStarted();
Log.e(LOG_TAG, "Almacenando en búfer");
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
if (callback != null) callback.onPlaying();
Log.e(LOG_TAG, "Reproduciendo");
break;
}
return false;
}
#Override
public void onCompletion(MediaPlayer mp) {
Log.e(LOG_TAG, "Reproducción finalizada");
stop();
}
/**
* Stops playing of the stream.
*/
public void stop() {
// stopping MediaPlayer in separate thread because it can take a time
new Thread(new Runnable() {
#Override
public void run() {
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) mMediaPlayer.stop(); // I get the error here when I destroy the Service quickly
mMediaPlayer.reset();
}
}
}).start();
if (callback != null) callback.onStopped();
Log.e(LOG_TAG, "stop()");
}
/**
* Is stream playing?
*
* #return true or false
*/
public Boolean isPlaying() {
return mMediaPlayer != null && mMediaPlayer.isPlaying();
}
public void setCallback(PlayerCallback callback) {
this.callback = callback;
}
}
Logcat:
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:39.578 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:39.578 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:39.678 27582-31945/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:39.678 27582-31945/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:39.678 27582-31945/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:39.678 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:39.688 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:39.688 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:39.688 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:39.688 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:15:39.798 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:39.798 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:39.808 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:39.808 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:39.808 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:39.808 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:39.808 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:39.938 27582-31952/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:39.938 27582-31952/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:39.938 27582-31952/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:39.938 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:39.938 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:39.938 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:39.938 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:39.948 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:15:40.069 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:40.069 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.079 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:40.079 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:40.079 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:40.079 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:40.079 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:40.179 27582-31957/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.179 27582-31957/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:40.179 27582-31957/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:40.179 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:40.189 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.189 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:40.189 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.189 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:15:40.289 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:40.289 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.299 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:40.299 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:40.299 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:40.299 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:40.299 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:40.429 27582-31966/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.429 27582-31966/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:40.429 27582-31966/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:40.429 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:40.429 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.429 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:15:40.429 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:40.429 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.549 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ isPlaying: no active player
09-08 19:15:40.549 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.559 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ setAudioStreamType: 3
09-08 19:15:40.559 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ MediaPlayer::setAudioStreamType
09-08 19:15:40.559 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ Preparando: rtsp://domain/folder/file.stream
09-08 19:15:40.559 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setVideoSurfaceTexture
09-08 19:15:40.559 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ prepareAsync
09-08 19:15:40.659 27582-31972/com.myaudioservice.app V/MediaPlayer-JNI﹕ isPlaying: 0
09-08 19:15:40.659 27582-31972/com.myaudioservice.app V/MediaPlayer-JNI﹕ reset
09-08 19:15:40.659 27582-31972/com.myaudioservice.app V/MediaPlayer﹕ reset
09-08 19:15:40.659 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=1, ext1=0, ext2=0
09-08 19:15:40.659 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(1, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.659 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ message received msg=8, ext1=0, ext2=0
09-08 19:15:40.659 27582-27596/com.myaudioservice.app V/MediaPlayer﹕ notify(8, 0, 0) callback on disconnected mediaplayer
09-08 19:15:40.669 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:16:01.281 27582-27582/com.myaudioservice.app D/AbsListView﹕ onDetachedFromWindow
09-08 19:16:01.311 27582-27582/com.myaudioservice.app E/com.myaudioservice.app.PlayerService﹕ stop()
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer-JNI﹕ release
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ setListener
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ disconnect
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ destructor
09-08 19:16:01.311 27582-32148/com.myaudioservice.app W/dalvikvm﹕ threadid=14: thread exiting with uncaught exception (group=0x4193eda0)
09-08 19:16:01.311 27582-27582/com.myaudioservice.app V/MediaPlayer﹕ disconnect
09-08 19:16:01.321 27582-32148/com.myaudioservice.app E/AndroidRuntime﹕ FATAL EXCEPTION: Thread-15992
Process: com.myaudioservice.app, PID: 27582
java.lang.IllegalStateException
at android.media.MediaPlayer.isPlaying(Native Method)
at com.myaudioservice.app.PlayerService$1.run(PlayerService.java:129)
at java.lang.Thread.run(Thread.java:841)
In documentation you can read that MediaPlayer.isPlaying() throws IllegalStateException if the internal player engine has not been initialized or has been released.
This code is not thread safe which is probably the reason of this exception (thread call release() and before mediaPlayer is set to null app invoking isPlaying() on released mediaPlayer). You need to add some synchronization to make it work (or use async methods form MediaPlayer).
Ok , I think I finally got what I wanted .
I do not know if I should mark the #KamilW response as the correct because it does have absolutely right but I will answer my question with the right code (or at least think is right) it can be useful to someone else.
My final code:
package com.myaudioservice.app;
import android.app.Service;
import android.content.Intent;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;
public class PlayerService extends Service implements MediaPlayer.OnPreparedListener, MediaPlayer.OnInfoListener, MediaPlayer.OnErrorListener, MediaPlayer.OnCompletionListener {
private static final String LOG_TAG = PlayerService.class.getName();
private String URL_STREAM = "rtsp://domain/folder/file.stream";
private MediaPlayer mMediaPlayer = null;
private PlayerCallback callback;
private final IBinder mBinder = new LocalBinder();
public class LocalBinder extends Binder {
PlayerService getService() {
return PlayerService.this;
}
}
#Override
public IBinder onBind(Intent intent) {
return mBinder;
}
#Override
public void onDestroy(){
if (mMediaPlayer != null) {
mMediaPlayer.release();
mMediaPlayer = null;
}
}
/**
* Starts playing stream.
* Note that we just start media player and do not obtain real URL of the stream.
* So, URL that will be redirected by server will not work. To make such URLs works, adding
* algorithm to obtain the real URL (f.e., create HttpConnection, connect to the server and
* get real URL from connection).
*
* //#param url String with URL of a server to connect
*/
public void start() {
if (mMediaPlayer == null) mMediaPlayer = new MediaPlayer();
if (isPlaying()) {
mMediaPlayer.stop();
mMediaPlayer.reset();
}
try {
mMediaPlayer.setDataSource(URL_STREAM);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
if (callback != null) callback.onPreStart();
Log.e(LOG_TAG, "Preparando: " + URL_STREAM);
mMediaPlayer.prepareAsync();
} catch (Exception e) {
if (mMediaPlayer != null) {
mMediaPlayer.reset();
}
if (callback != null) callback.onStartFailed();
Log.e(LOG_TAG, e.toString());
//mMediaPlayer = null;
}
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnInfoListener(this);
mMediaPlayer.setOnErrorListener(this);
mMediaPlayer.setOnCompletionListener(this);
}
#Override
public void onPrepared(MediaPlayer mp) {
mp.start();
Log.e(LOG_TAG, "start()");
}
#Override
public boolean onInfo(MediaPlayer mp, int what, int extra) {
switch (what) {
case MediaPlayer.MEDIA_INFO_BUFFERING_START:
if (callback != null) callback.onStarted();
Log.e(LOG_TAG, "Almacenando en búfer");
break;
case MediaPlayer.MEDIA_INFO_BUFFERING_END:
if (callback != null) callback.onPlaying();
Log.e(LOG_TAG, "Reproduciendo");
break;
}
return false;
}
#Override
public void onCompletion(MediaPlayer mp) {
Log.e(LOG_TAG, "Reproducción finalizada");
stop();
}
/**
* Stops playing of the stream.
*/
public void stop() {
// stopping MediaPlayer in separate thread because it can take a time
new Thread(new Runnable() {
#Override
public void run() {
if (mMediaPlayer != null) {
if (mMediaPlayer.isPlaying()) mMediaPlayer.stop();
mMediaPlayer.reset();
}
}
}).start();
if (callback != null) callback.onStopped();
Log.e(LOG_TAG, "stop()");
}
/**
* Is stream playing?
*
* #return true or false
*/
public Boolean isPlaying() {
return mMediaPlayer != null && mMediaPlayer.isPlaying();
}
public void setCallback(PlayerCallback callback) {
this.callback = callback;
}
#Override
public boolean onError(MediaPlayer mp, int what, int extra){
if(what == MediaPlayer.MEDIA_ERROR_UNKNOWN ||
what == MediaPlayer.MEDIA_ERROR_SERVER_DIED ||
extra == MediaPlayer.MEDIA_ERROR_IO ||
extra == MediaPlayer.MEDIA_ERROR_MALFORMED ||
extra == MediaPlayer.MEDIA_ERROR_UNSUPPORTED ||
extra == MediaPlayer.MEDIA_ERROR_TIMED_OUT ||
extra == MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK){
stop();
if (callback != null) callback.onStartFailed();
}
return true;// Si hay error, no es necesario llamar a onCompletionListener, por eso: true
}
}
I would also like to be inspected by an expert to tell me what I need to improve in the code (if not too much to ask). Thak You.

Error in OnClick Script

myOnClickListener = new MyOnClickListener(this);
nRecyclerView = (RecyclerView) findViewById(R.id.my_recycler2_view);
nRecyclerView.setHasFixedSize(true);
static class MyOnClickListener implements View.OnClickListener{
private final Context context;
private MyOnClickListener(Context context) {
this.context = context;
}
public void onClick(View v) {
checkWhich(v);
}
private static void checkWhich (View v){
int selectedItemPosition = nRecyclerView.getChildPosition(v);
RecyclerView.ViewHolder nViewHolder = nRecyclerView.findViewHolderForPosition (selectedItemPosition);
TextView textViewName = (TextView) nViewHolder.itemView.findViewById(R.id.textViewCountry);
String selectedName = (String) textViewName.getText();
for (int i = 0; i < MyData.countryArray.length; i++){
if (selectedName==MyData.countryArray[i]) {
System.out.println(selectedName);
}
}
}
}
This has worked before, but isnt working now. Did I do anything wrong? I have 2 RecyclerViews but they are not visible together. This click listener is for one RecyclerView only.
LogCat
01-31 18:41:17.514 3441-3441/com.wc.gap.worldcupfixture I/art﹕ Late-enabling -Xcheck:jni
01-31 18:41:17.761 3441-3471/com.wc.gap.worldcupfixture D/OpenGLRenderer﹕ Render dirty regions requested: true
01-31 18:41:17.767 3441-3441/com.wc.gap.worldcupfixture D/Atlas﹕ Validating map...
01-31 18:41:17.792 3441-3471/com.wc.gap.worldcupfixture I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: QUALCOMM Build: 10/24/14, 167c270, I68fa98814b
01-31 18:41:17.793 3441-3471/com.wc.gap.worldcupfixture I/OpenGLRenderer﹕ Initialized EGL, version 1.4
01-31 18:41:17.805 3441-3471/com.wc.gap.worldcupfixture D/OpenGLRenderer﹕ Enabling debug mode 0
01-31 18:41:57.529 3441-3470/com.wc.gap.worldcupfixture I/System.out﹕ 544, 543, 646, 797, 64, 66, 987
01-31 18:43:25.218 4242-4271/com.wc.gap.worldcupfixture D/OpenGLRenderer﹕ Render dirty regions requested: true
01-31 18:43:25.224 4242-4242/com.wc.gap.worldcupfixture D/Atlas﹕ Validating map...
01-31 18:43:25.257 4242-4271/com.wc.gap.worldcupfixture I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: QUALCOMM Build: 10/24/14, 167c270, I68fa98814b
01-31 18:43:25.258 4242-4271/com.wc.gap.worldcupfixture I/OpenGLRenderer﹕ Initialized EGL, version 1.4
01-31 18:43:25.270 4242-4271/com.wc.gap.worldcupfixture D/OpenGLRenderer﹕ Enabling debug mode 0
When implementing View.OnClickListener, do it like below.
public class YourClass extends Activity implements View.OnClickListener
#Override
protected void onCreate(Bundle savedInstanceState) {
//Component setup here.
nRecyclerView = (RecyclerView) findViewById(R.id.my_recycler2_view);
nRecyclerView.setHasFixedSize(true);
nRecyclerView.setOnClickListener(this);
}
#Override
public void onClick(View v) {
checkWhich(v);
}
private static void checkWhich (View v){
int selectedItemPosition = nRecyclerView.getChildPosition(v);
RecyclerView.ViewHolder nViewHolder = nRecyclerView.findViewHolderForPosition (selectedItemPosition);
TextView textViewName = (TextView) nViewHolder.itemView.findViewById(R.id.textViewCountry);
String selectedName = textViewName.getText().toString();
for (int i = 0; i < MyData.countryArray.length; i++){
if (selectedName==MyData.countryArray[i]) {
System.out.println(selectedName);
}
}
}
}

why my android app is unfortunately has stopped

I have the following code in android, but when I run it, it complains: unfortunately has stopped:
package com.example.trave;
import java.util.List;
import com.example.trave.data.NoteDataSource;
import com.example.trave.data.NoteItem;
import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
public class MainActivity extends Activity {
private NoteDataSource dataSource;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dataSource = new NoteDataSource(this);
List<NoteItem> notes = dataSource.findAll();
NoteItem note = notes.get(0);
note.setText("Updated!");
dataSource.update(note);
notes = dataSource.findAll();
note = notes.get(0);
Log.i("NOTES", note.getKey() + ": " + note.getText());
}
#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;
}
}
package com.example.trave.data;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import android.content.Context;
import android.content.SharedPreferences;
public class NoteDataSource {
private static final String PREFKEY = "notes";
private SharedPreferences notePrefs;
public NoteDataSource(Context context) {
notePrefs = context.getSharedPreferences(PREFKEY, Context.MODE_PRIVATE);
}
public List<NoteItem> findAll() {
Map<String, ?> notesMap = notePrefs.getAll();
SortedSet<String> keys = new TreeSet<String>(notesMap.keySet());
List<NoteItem> noteList = new ArrayList<NoteItem>();
for (String key : keys) {
NoteItem note = new NoteItem();
note.setKey(key);
note.setText((String)note.getKey());
noteList.add(note);
}
return noteList;
}
public boolean update(NoteItem note) {
SharedPreferences.Editor editor = notePrefs.edit();
editor.putString(note.getKey(), note.getText());
editor.commit();
return true;
}
public boolean remove(NoteItem note) {
if (notePrefs.contains(note.getKey())) {
SharedPreferences.Editor editor = notePrefs.edit();
editor.remove(note.getKey());
editor.commit();
}
return true;
}
}
package com.example.trave.data;
import android.annotation.SuppressLint;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class NoteItem {
private String key;
private String text;
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
#SuppressLint("SimpleDateFormat")
public static NoteItem getNew() {
Locale locale = new Locale("en_US");
Locale.setDefault(locale);
String pattern = "yyyy-MM-dd HH:mm:ss Z";
SimpleDateFormat formatter = new SimpleDateFormat(pattern);
String key = formatter.format(new Date());
NoteItem note = new NoteItem();
note.setKey(key);
note.setText("");
return note;
}
}
what is the problem and how to fix it?
The logCat:
09-08 11:15:23.674: E/SurfaceFlinger(37): ro.sf.lcd_density must be defined as a build property
09-08 11:15:23.793: E/Trace(1552): error opening trace file: No such file or directory (2)
09-08 11:15:24.533: D/AndroidRuntime(1552): Shutting down VM
09-08 11:15:24.533: W/dalvikvm(1552): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
09-08 11:15:24.543: E/AndroidRuntime(1552): FATAL EXCEPTION: main
09-08 11:15:24.543: E/AndroidRuntime(1552): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.trave/com.example.trave.MainActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.app.ActivityThread.access$600(ActivityThread.java:141)
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.os.Handler.dispatchMessage(Handler.java:99)
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.os.Looper.loop(Looper.java:137)
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.app.ActivityThread.main(ActivityThread.java:5041)
09-08 11:15:24.543: E/AndroidRuntime(1552): at java.lang.reflect.Method.invokeNative(Native Method)
09-08 11:15:24.543: E/AndroidRuntime(1552): at java.lang.reflect.Method.invoke(Method.java:511)
09-08 11:15:24.543: E/AndroidRuntime(1552): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
09-08 11:15:24.543: E/AndroidRuntime(1552): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
09-08 11:15:24.543: E/AndroidRuntime(1552): at dalvik.system.NativeStart.main(Native Method)
09-08 11:15:24.543: E/AndroidRuntime(1552): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
09-08 11:15:24.543: E/AndroidRuntime(1552): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
09-08 11:15:24.543: E/AndroidRuntime(1552): at java.util.ArrayList.get(ArrayList.java:304)
09-08 11:15:24.543: E/AndroidRuntime(1552): at com.example.trave.MainActivity.onCreate(MainActivity.java:25)
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.app.Activity.performCreate(Activity.java:5104)
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
09-08 11:15:24.543: E/AndroidRuntime(1552): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
09-08 11:15:24.543: E/AndroidRuntime(1552): ... 11 more
09-08 11:15:24.552: W/ActivityManager(291): Force finishing activity com.example.trave/.MainActivity
09-08 11:15:24.562: W/WindowManager(291): Failure taking screenshot for (246x410) to layer 21015
you got IndexOutOfBoundsException at
List<NoteItem> notes = dataSource.findAll();
NoteItem note = notes.get(0);
or at
notes = dataSource.findAll();
note = notes.get(0);
because the list seems to be empty, you should check for size
List<NoteItem> notes = dataSource.findAll();
if (notes.size()>0)
NoteItem note = notes.get(0);
and check data you are providing to the lists
You get an IndexOutOfBoundsException because the NoteList is empty. Most likely at:
NoteItem note = notes.get(0);
in the onCreate method. You need to check for the empty result of NoteDataSource.findAll() like this:
List<NoteItem> notes = dataSource.findAll();
if(notes.isEmpty())
return; // Or whatever you must do in your App
else {
NoteItem note = notes.get(0);
// ... The rest of your onCreate code...
Additionally, in your NoteDataSource.update() and NoteDataSource.remove() please return the result of the commit() instead always true as of the contract: SharedPreferences.Editor.commit
otherwise there's not much sense in returning a boolean.

Android: App crashes at getting text form editText in dialog

everytime i press the positive button of the dialog my app crashes with an nullpointerexception but i have no idea what i have to change. i think the problem is caused by the part with getText() because it works when i delete it here:
class newLessonDialog extends DialogFragment {
#Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
// Get the layout inflater
LayoutInflater inflater = getActivity().getLayoutInflater();
// Inflate and set the layout for the dialog
// Pass null as the parent view because its going in the dialog layout
builder.setView(inflater.inflate(R.layout.new_lesson_dialog, null))
// Add action buttons,
.setPositiveButton("Speichern", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id)
{
EditText eF = (EditText)getView().findViewById(R.id.editFach);
fach = eF.getText().toString();
EditText eR = (EditText)getView().findViewById(R.id.editRaum);
raum = eR.getText().toString();
EditText eL = (EditText)getView().findViewById(R.id.editLehrer);
lehrer = eL.getText().toString();
save(fach, raum, lehrer, index);
}
})
.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
newLessonDialog.this.getDialog().cancel();
}
});
return builder.create();
}
}
and
public static void save(String fach, String raum, String lehrer, int index)
{
BufferedWriter out = null;
try
{
out = new BufferedWriter(new FileWriter("/sdcard/" + index + "fach.txt"));
out.write(fach);
out = new BufferedWriter(new FileWriter("/sdcard/" + index + "raum.txt"));
out.write(raum);
out = new BufferedWriter(new FileWriter("/sdcard/" + index + "lehrer.txt"));
out.write(lehrer);
out.close();
}
catch (Exception e)
{
Toast.makeText(getAppContext(), "Fehler beim Speichern!", Toast.LENGTH_SHORT);
}
}
logcat:
08-13 19:14:07.609 23114-23114/de.nathan.android.droidschool W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41760700)
08-13 19:14:07.619 23114-23114/de.nathan.android.droidschool E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.NullPointerException
at de.nathan.android.droidschool.MainActivity$fragmentTab1$1$1newLessonDialog$2.onClick(MainActivity.java:267)
at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:166)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5103)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
08-13 19:14:07.639 438-6851/? W/ActivityManager: Process de.nathan.android.droidschool has crashed too many times: killing!
08-13 19:14:07.639 438-6851/? W/ActivityManager: Force finishing activity de.nathan.android.droidschool/.MainActivity
08-13 19:14:07.659 438-6851/? I/ActivityManager: Killing proc 23114:de.nathan.android.droidschool/u0a10018: crash
08-13 19:14:07.679 438-551/? W/InputDispatcher: channel '428f0a50 de.nathan.android.droidschool/de.nathan.android.droidschool.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9
08-13 19:14:07.679 438-551/? E/InputDispatcher: channel '428f0a50 de.nathan.android.droidschool/de.nathan.android.droidschool.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
08-13 19:14:07.679 438-551/? W/InputDispatcher: channel '41f4abe8 de.nathan.android.droidschool/de.nathan.android.droidschool.MainActivity (server)' ~ Consumer closed input channel or an error occurred. events=0x9
08-13 19:14:07.679 438-551/? E/InputDispatcher: channel '41f4abe8 de.nathan.android.droidschool/de.nathan.android.droidschool.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
08-13 19:14:07.679 438-448/? W/InputDispatcher: Attempted to unregister already unregistered input channel '41f4abe8 de.nathan.android.droidschool/de.nathan.android.droidschool.MainActivity (server)'
08-13 19:14:07.679 438-449/? W/InputDispatcher: Attempted to unregister already unregistered input channel '428f0a50 de.nathan.android.droidschool/de.nathan.android.droidschool.MainActivity (server)'
08-13 19:14:07.679 438-448/? I/WindowState: WIN DEATH: Window{41f4abe8 u0 de.nathan.android.droidschool/de.nathan.android.droidschool.MainActivity}
08-13 19:14:07.679 438-449/? I/WindowState: WIN DEATH: Window{428f0a50 u0 de.nathan.android.droidschool/de.nathan.android.droidschool.MainActivity}
Try replacing your getView()s with getDialog().
EditText eF = (EditText)getDialog().findViewById(R.id.editFach);
fach = eF.getText().toString();
EditText eR = (EditText)getDialog().findViewById(R.id.editRaum);
raum = eR.getText().toString();
EditText eL = (EditText)getDialog().findViewById(R.id.editLehrer);
lehrer = eL.getText().toString();
You may as well keep a reference to the original view; it'll make things a lot easier. Try:
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
final View view = inflater.inflate(R.layout.new_lesson_dialog, null);
builder.setView(view)
.setPositiveButton("Speichern", new DialogInterface.OnClickListener() {
#Override
public void onClick(DialogInterface dialog, int id) {
EditText eF = (EditText)view.findViewById(R.id.editFach);
...etc.

Categories