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.
Related
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.
I have a problem connected with reading a file in Java Application. Please help me as I'm trying to do it for four days and my CS teacher is not into Android Apps. Also any of the tutorials read does not help me.
I have a following app:
package com.bachosz.billionaires;
import android.support.v7.app.ActionBarActivity;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.StringTokenizer;
import android.content.ContextWrapper;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivityBillionaires extends ActionBarActivity {
private int currentQuestion;
private String [] answers;
private Button answerButton;
private Button questionButton;
private TextView questionView;
private TextView answerView;
private EditText answerText;
private Question [] questions;
private Button buttonA;
private Button buttonB;
private Button buttonC;
private Button buttonD;
#Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_activity_billionaires);
try {
init();
} catch (IOException e) {
e.printStackTrace();
}
}
public void init() throws IOException
{
questions = new Question[2];
currentQuestion = 0;
InputStream inputStream = getResources().openRawResource(R.raw.questionstable);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
String content,a,b,c,d,correct;
int id, x = 0;
StringTokenizer st = null;
while ((line=reader.readLine()) != null)
{
st= new StringTokenizer(line, ",");
id = Integer.parseInt(st.nextToken());
content = st.nextToken();
a = st.nextToken();
b = st.nextToken();
c = st.nextToken();
d = st.nextToken();
correct = st.nextToken();
questions[x] = new Question(id, content, a, b, c, d, correct);
x++;
}
reader.close();
answerButton = (Button)findViewById(R.id.AnswerButton);
questionButton = (Button)findViewById(R.id.QuestionButton);
questionView = (TextView)findViewById(R.id.QuestionTextView);
answerView = (TextView) findViewById(R.id.AnswerTextView);
answerText = (EditText) findViewById(R.id.AnswerText);
buttonA = (Button)findViewById(R.id.buttonA);
buttonB = (Button)findViewById(R.id.buttonB);
buttonC = (Button)findViewById(R.id.buttonC);
buttonD = (Button)findViewById(R.id.buttonD);
answerButton.setOnClickListener(new OnClickListener()
{
public void onClick(View v) {
checkAnswer();
}});
questionButton.setOnClickListener(new OnClickListener(){
#Override
public void onClick(View v) {
showQuestion();
}});
}
public void showQuestion()
{
// if(currentQuestion == questions.length)
// currentQuestion =0;
questionView.setText(questions[0].toString());
answerView.setText("");
answerText.setText("");
currentQuestion++;
}
public boolean isCorrect(String answer)
{
return (answer.equalsIgnoreCase(questions[currentQuestion].getCorrect()));
}
public void checkRight()
{
// String right
}
public void checkAnswer()
{
String answer = questions[currentQuestion].getCorrect();
if(isCorrect(answer))
answerView.setText("You're right!");
else
answerView.setText("Sorry, the correct answer is "+answers[currentQuestion]);
}
#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_activity_billionaires, menu);
return true;
}
#Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
It is taken from Java application I was writing previously (that is why so many comments). How I can access the fileName in Android App? I was trying InputStream, get Assets, etc. but It does not work or I am doing it improperly. Currently it is throwing NullPointerException.
LOG CAT:
10-09 13:38:37.663: E/Trace(921): error opening trace file: No such file or directory (2)
10-09 13:38:39.354: D/AndroidRuntime(921): Shutting down VM
10-09 13:38:39.354: W/dalvikvm(921): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
10-09 13:38:39.384: E/AndroidRuntime(921): FATAL EXCEPTION: main
10-09 13:38:39.384: E/AndroidRuntime(921): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bachosz.billionaires/com.bachosz.billionaires.MainActivityBillionaires}: java.lang.NullPointerException
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.access$600(ActivityThread.java:130)
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
10-09 13:38:39.384: E/AndroidRuntime(921): at android.os.Handler.dispatchMessage(Handler.java:99)
10-09 13:38:39.384: E/AndroidRuntime(921): at android.os.Looper.loop(Looper.java:137)
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.main(ActivityThread.java:4745)
10-09 13:38:39.384: E/AndroidRuntime(921): at java.lang.reflect.Method.invokeNative(Native Method)
10-09 13:38:39.384: E/AndroidRuntime(921): at java.lang.reflect.Method.invoke(Method.java:511)
10-09 13:38:39.384: E/AndroidRuntime(921): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-09 13:38:39.384: E/AndroidRuntime(921): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-09 13:38:39.384: E/AndroidRuntime(921): at dalvik.system.NativeStart.main(Native Method)
10-09 13:38:39.384: E/AndroidRuntime(921): Caused by: java.lang.NullPointerException
10-09 13:38:39.384: E/AndroidRuntime(921): at com.bachosz.billionaires.MainActivityBillionaires.readFile(MainActivityBillionaires.java:111)
10-09 13:38:39.384: E/AndroidRuntime(921): at com.bachosz.billionaires.MainActivityBillionaires.init(MainActivityBillionaires.java:140)
10-09 13:38:39.384: E/AndroidRuntime(921): at com.bachosz.billionaires.MainActivityBillionaires.onCreate(MainActivityBillionaires.java:70)
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.Activity.performCreate(Activity.java:5008)
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
10-09 13:38:39.384: E/AndroidRuntime(921): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
10-09 13:38:39.384: E/AndroidRuntime(921): ... 11 more
The error says you're getting a NPE (Null Pointer Exception) at com.bachosz.billionaires.MainActivityBillionaires. You need to look at the code section that you use to call that activity. (it is not in your code above - or else we don't know which line with the given information)
Another thing you have to make sure is that you have the appropriate context.
AssetManager assetManage = appContext.getAssets();
String[] filelist = assetManage.list("");
First you should clean up your code, at least to show it here where we don't know what are you doing.
It's easier to understand.
Why are you using assets? In Android the most common way to access resources is the .../res/raw folder.
It makes a reference of the file in the autogenerated R.class so you can access it anywhere.
Make sure your filename is lowercase and has no spaces. If you haven't raw folder under res, create it manually.
Try this:
InputStream inputStream = getResources().openRawResource(R.raw.YOURFILE);
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = reader.readLine();
while (line != null)
{
// Read file.
}
Firstly: copy YOURFILE to assets folder.
Then, AssetManager assetManage = getAssets();
Then,
InputStream myInput = null;
try {
myInput = assetManager.open("YOURFILE");
} catch (IOException e1) {
e1.printStackTrace();
}
And finally BufferedReader reader = new BufferedReader(new InputStreamReader(myInput));
follow the above code step by step.
I have tried to learn to write an application which is basically a bluetooth messenger. Things had been fine unless I tried to install and run it. It gets installed successfully but crashes down at start up itself. Can you please tell me what is wrong ?
This is the code for the main activity. There are three more activities apart from this.
import java.io.IOException;
import java.util.ArrayList;
import android.app.ListActivity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
public final static String UUID = "3606f360-e4df-11e0-9572-0800200c9a66";
BluetoothAdapter bluetoothAdapter;
BroadcastReceiver discoverDevicesReceiver;
BroadcastReceiver discoveryFinishedReceiver;
//---store all the discovered devices---
ArrayList<BluetoothDevice> discoveredDevices;
ArrayList<String> discoveredDevicesNames;
//---store all the paired devices---
ArrayList<BluetoothDevice> pairedDevices;
static TextView txtData;
EditText txtMessage;
//---thread for running the server socket---
ServerThread serverThread;
//---thread for connecting to the client socket---
ConnectToServerThread connectToServerThread;
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//---init the ArrayList objects and bluetooth adapter---
discoveredDevices = new ArrayList<BluetoothDevice>();
discoveredDevicesNames = new ArrayList<String>();
pairedDevices = new ArrayList<BluetoothDevice>();
bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
//---for displaying the messages received---
txtData = (TextView) findViewById(R.id.txtData);
txtMessage = (EditText) findViewById(R.id.txtMessage);
}
#Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}
//---make yourself discoverable---
public void MakeDiscoverable(View view)
{
Intent i = new Intent(
BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
i.putExtra(
BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
startActivity(i);
}
/*
//---find all the previously paired devices---
private void QueryPairedDevices(){
Set<BluetoothDevice> allPairedDevices =
bluetoothAdapter.getBondedDevices();
//---if there are paired devices---
if (allPairedDevices.size() > 0) {
//---loop through paired devices---
for (BluetoothDevice device : allPairedDevices) {
//---add the name and address to an array adapter
// to show in a ListView---
Log.d("UsingBluetooth", device.getName() + "\n" +
device.getAddress());
pairedDevices.add(device);
}
}
}
*/
//---used to discover other bluetooth devices---
private void DiscoveringDevices() {
if (discoverDevicesReceiver == null) {
discoverDevicesReceiver = new BroadcastReceiver() {
//---fired when a new device is discovered---
#Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
//---a device is discovered---
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
//---get the BluetoothDevice object from
// the Intent---
BluetoothDevice device =
intent.getParcelableExtra(
BluetoothDevice.EXTRA_DEVICE);
//---add the name and address to an array
// adapter to show in a ListView---
//---only add if the device is not already
// in the list---
if (!discoveredDevices.contains(device)) {
//---add the device---
discoveredDevices.add(device);
//---add the name of the device; used for
// ListView---
discoveredDevicesNames.add(device.getName());
//---display the items in the ListView---
setListAdapter(new
ArrayAdapter<String>(getBaseContext(),
android.R.layout.simple_list_item_1,
discoveredDevicesNames));
}
}
}
};
}
if (discoveryFinishedReceiver==null) {
discoveryFinishedReceiver = new BroadcastReceiver() {
//---fired when the discovery is done---
#Override
public void onReceive(Context context, Intent intent) {
//---enable the listview when discovery is over; about 12 seconds---
getListView().setEnabled(true);
Toast.makeText(getBaseContext(),
"Discovery completed. Select a device to start chatting.",
Toast.LENGTH_LONG).show();
unregisterReceiver(discoveryFinishedReceiver);
}
};
}
//---register the broadcast receivers---
IntentFilter filter1 = new
IntentFilter(BluetoothDevice.ACTION_FOUND);
IntentFilter filter2 = new
IntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
registerReceiver(discoverDevicesReceiver, filter1);
registerReceiver(discoveryFinishedReceiver, filter2);
//---disable the listview when discover is in progress---
getListView().setEnabled(false);
Toast.makeText(getBaseContext(),
"Discovery in progress...please wait...",
Toast.LENGTH_LONG).show();
bluetoothAdapter.startDiscovery();
}
//---discover other bluetooth devices---
public void DiscoverDevices(View view)
{
//---query for all paired devices---
//QueryPairedDevices();
//---discover other devices---
DiscoveringDevices();
}
#Override
public void onPause() {
super.onPause();
//---cancel discovery of other bluetooth devices
bluetoothAdapter.cancelDiscovery();
//---unregister the broadcast receiver for
// discovering devices---
if (discoverDevicesReceiver != null) {
try {
unregisterReceiver(discoverDevicesReceiver);
} catch(Exception e) {
}
}
//---if you are currently connected to someone...---
if (connectToServerThread!=null) {
try {
//---close the connection---
connectToServerThread.bluetoothSocket.close();
} catch (IOException e) {
Log.d("MainActivity", e.getLocalizedMessage());
}
}
//---stop the thread running---
if (serverThread!=null) serverThread.cancel();
}
//---used for updating the UI on the main activity---
static Handler UIupdater = new Handler() {
#Override
public void handleMessage(Message msg) {
int numOfBytesReceived = msg.arg1;
byte[] buffer = (byte[]) msg.obj;
//---convert the entire byte array to string---
String strReceived = new String(buffer);
//---extract only the actual string received---
strReceived = strReceived.substring(
0, numOfBytesReceived);
//---display the text received on the TextView---
txtData.setText(txtData.getText().toString() +
strReceived);
}
};
#Override
public void onResume() {
super.onResume();
//---start the socket server---
serverThread = new ServerThread(bluetoothAdapter);
serverThread.start();
}
//---when a client is tapped in the ListView---
public void onListItemClick(ListView parent, View v,
int position, long id) {
//---if you are already talking to someone...---
if (connectToServerThread!=null) {
try {
//---close the connection first---
connectToServerThread.bluetoothSocket.close();
} catch (IOException e) {
Log.d("MainActivity", e.getLocalizedMessage());
}
}
//---connect to the selected Bluetooth device---
BluetoothDevice deviceSelected =
discoveredDevices.get(position);
connectToServerThread = new
ConnectToServerThread(deviceSelected, bluetoothAdapter);
connectToServerThread.start();
//---tell the user that he is connected to who---
Toast.makeText(this, "You have connected to " +
discoveredDevices.get(position).getName(),
Toast.LENGTH_SHORT).show();
}
private class WriteTask extends AsyncTask<String, Void, Void> {
protected Void doInBackground(String... args) {
try {
connectToServerThread.commsThread.write(args[0]);
} catch (Exception e) {
Log.d("MainActivity", e.getLocalizedMessage());
}
return null;
}
}
//---send a message to the connected socket client---
public void SendMessage(View view)
{
if (connectToServerThread!=null) {
///=========
//connectToServerThread.commsThread.write(
// txtMessage.getText().toString());
new WriteTask().execute(txtMessage.getText().toString());
///=========
} else {
Toast.makeText(this, "Select a client first",
Toast.LENGTH_SHORT).show();
}
}
}
ServerThread class :
import java.io.IOException;
import java.util.UUID;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothServerSocket;
import android.bluetooth.BluetoothSocket;
import android.util.Log;
public class ServerThread extends Thread {
//---the server socket---
private final BluetoothServerSocket bluetoothServerSocket;
public ServerThread(BluetoothAdapter bluetoothAdapter) {
BluetoothServerSocket tmp = null;
try {
//---UUID must be the same for both the client and
// the server---
tmp =
bluetoothAdapter.listenUsingRfcommWithServiceRecord(
"BluetoothApp", UUID.fromString(MainActivity.UUID));
} catch (IOException e) {
Log.d("ServerThread", e.getLocalizedMessage());
}
bluetoothServerSocket = tmp;
}
public void run() {
BluetoothSocket socket = null;
//---keep listening until exception occurs
// or a socket is returned---
while (true) {
try {
socket = bluetoothServerSocket.accept();
} catch (IOException e) {
Log.d("ServerThread", e.getLocalizedMessage());
break;
}
//---if a connection was accepted---
if (socket != null) {
//---create a separate thread to listen for
// incoming data---
CommsThread commsThread = new CommsThread(socket);
commsThread.run();
}
}
}
public void cancel() {
try {
bluetoothServerSocket.close();
} catch (IOException e) {
Log.d("ServerThread", e.getLocalizedMessage());
}
}
}
LogCat
04-13 18:25:06.684: D/AndroidRuntime(397): Shutting down VM
04-13 18:25:06.684: W/dalvikvm(397): threadid=1: thread exiting with uncaught exception (group=0x40015560)
04-13 18:25:06.704: E/AndroidRuntime(397): FATAL EXCEPTION: main
04-13 18:25:06.704: E/AndroidRuntime(397): java.lang.RuntimeException: Unable to resume activity {net.learn2develop.usingbluetooth/net.learn2develop.usingbluetooth.MainActivity}: java.lang.NullPointerException
04-13 18:25:06.704: E/AndroidRuntime(397): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.os.Looper.loop(Looper.java:123)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-13 18:25:06.704: E/AndroidRuntime(397): at java.lang.reflect.Method.invokeNative(Native Method)
04-13 18:25:06.704: E/AndroidRuntime(397): at java.lang.reflect.Method.invoke(Method.java:507)
04-13 18:25:06.704: E/AndroidRuntime(397): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-13 18:25:06.704: E/AndroidRuntime(397): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-13 18:25:06.704: E/AndroidRuntime(397): at dalvik.system.NativeStart.main(Native Method)
04-13 18:25:06.704: E/AndroidRuntime(397): Caused by: java.lang.NullPointerException
04-13 18:25:06.704: E/AndroidRuntime(397): at net.learn2develop.usingbluetooth.ServerThread.<init>(ServerThread.java:21)
04-13 18:25:06.704: E/AndroidRuntime(397): at net.learn2develop.usingbluetooth.MainActivity.onResume(MainActivity.java:235)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.app.Activity.performResume(Activity.java:3832)
04-13 18:25:06.704: E/AndroidRuntime(397): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
04-13 18:25:06.704: E/AndroidRuntime(397): ... 12 more
04-13 18:25:08.764: I/Process(397): Sending signal. PID: 397 SIG: 9
04-13 18:25:10.354: D/AndroidRuntime(415): Shutting down VM
04-13 18:25:10.354: W/dalvikvm(415): threadid=1: thread exiting with uncaught exception (group=0x40015560)
04-13 18:25:10.364: E/AndroidRuntime(415): FATAL EXCEPTION: main
04-13 18:25:10.364: E/AndroidRuntime(415): java.lang.RuntimeException: Unable to resume activity {net.learn2develop.usingbluetooth/net.learn2develop.usingbluetooth.MainActivity}: java.lang.NullPointerException
04-13 18:25:10.364: E/AndroidRuntime(415): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2120)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2135)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1668)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.app.ActivityThread.access$1500(ActivityThread.java:117)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.os.Handler.dispatchMessage(Handler.java:99)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.os.Looper.loop(Looper.java:123)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.app.ActivityThread.main(ActivityThread.java:3683)
04-13 18:25:10.364: E/AndroidRuntime(415): at java.lang.reflect.Method.invokeNative(Native Method)
04-13 18:25:10.364: E/AndroidRuntime(415): at java.lang.reflect.Method.invoke(Method.java:507)
04-13 18:25:10.364: E/AndroidRuntime(415): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
04-13 18:25:10.364: E/AndroidRuntime(415): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
04-13 18:25:10.364: E/AndroidRuntime(415): at dalvik.system.NativeStart.main(Native Method)
04-13 18:25:10.364: E/AndroidRuntime(415): Caused by: java.lang.NullPointerException
04-13 18:25:10.364: E/AndroidRuntime(415): at net.learn2develop.usingbluetooth.ServerThread.<init>(ServerThread.java:21)
04-13 18:25:10.364: E/AndroidRuntime(415): at net.learn2develop.usingbluetooth.MainActivity.onResume(MainActivity.java:235)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.app.Activity.performResume(Activity.java:3832)
04-13 18:25:10.364: E/AndroidRuntime(415): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2110)
04-13 18:25:10.364: E/AndroidRuntime(415): ... 12 more
04-13 18:25:13.304: I/Process(415): Sending signal. PID: 415 SIG: 9
Possible changes you can try which might help you.
In ServerThread.java
public void run() {
....
while(!Thread.currentThread().isInterrupted()){
//do something
}
}
If this works fine, otherwise try:
In MainActivity.java
#Override
public void onCreate() {
....
//Start your thread here
//---start the socket server---
serverThread = new ServerThread(bluetoothAdapter);
serverThread.start();
}
#Override
public void onResume() {
super.onResume();
//handle your thread here - the following maynot be helpful, but logiaclly speaking, //you must handle your threads here
if(serverThread.isAlive())
serverThread.resume();
else
serverThread.interrupt();
}
I have been tasked to resolve an issue for a group project at my university however I cannot seem to resolve an issue with a NullPointerException in my service class. Our goal is to create a script which continually monitors the android history until it finds a match - then executes a warning class if the service class finds a match in the browser history. The issue occurs on line 71 (of service class) however I do not know how to resolve the issue.
Service Class:
public class Service_class extends Service {
String Dirty1 = "www.pornhub.com";
String Dirty2 = "www.playboy.com";
String Dirty3 = "www.playboy.com";
String Dirty4 = "www.playboy.com";
String Dirty5 = "www.playboy.com";
String Dirty6 = "www.playboy.com";
String Dirty7 = "www.playboy.com";
String Dirty8 = "www.playboy.com";
String Dirty9 = "www.playboy.com";
String Dirty10 = "www.playboy.com";
#Override
public IBinder onBind(Intent arg0) {
return null;
}
#Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
return START_STICKY;
}
#Override
public void onDestroy() {
super.onDestroy();
Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
}
#Override
public void onCreate() {
super.onCreate();
TextView tv = (TextView) findViewById(R.id.hello);
String[] projection = new String[] { Browser.BookmarkColumns.TITLE,
Browser.BookmarkColumns.URL };
Cursor cursor = managedQuery(android.provider.Browser.BOOKMARKS_URI,
projection, null, null, null);
String urls = "";
if (cursor.moveToFirst()) {
String url1 = null;
String url2 = null;
do {
String url = cursor.getString(cursor.getColumnIndex(Browser.BookmarkColumns.URL));
if (url.toLowerCase().contains(Dirty1)) {
} else if (url.toLowerCase().contains(Dirty2)) {
} else if (url.toLowerCase().contains(Dirty3)) {
} else if (url.toLowerCase().contains(Dirty4)) {
} else if (url.toLowerCase().contains(Dirty5)) {
} else if (url.toLowerCase().contains(Dirty6)) {
} else if (url.toLowerCase().contains(Dirty7)) {
} else if (url.toLowerCase().contains(Dirty8)) {
} else if (url.toLowerCase().contains(Dirty9)) {
} else if (url.toLowerCase().contains(Dirty10)) {
//if (url.toLowerCase().contains(Filthy)) {
urls = urls
+ cursor.getString(cursor.getColumnIndex(Browser.BookmarkColumns.TITLE)) + " : "
+ url + "\n";
Intent intent = new Intent(Service_class.this, Warning.class);
Service_class.this.startActivity(intent);
}
} while (cursor.moveToNext());
// tv.setText(urls);
}
}
private void setContentView(int main3) {
// TODO Auto-generated method stub
}
private TextView findViewById(int hello) {
// TODO Auto-generated method stub
return null;
}
private Cursor managedQuery(Uri bookmarksUri, String[] projection,
Object object, Object object2, Object object3) {
// TODO Auto-generated method stub
return null;
}}
Main.java
import java.util.Calendar;
import com.parse.ParseAnalytics;
import com.parse.ParseObject;
import android.app.Activity;
import android.app.AlarmManager;
import android.app.AlertDialog;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.TrafficStats;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Chronometer;
import android.widget.TextView;
public class Main extends Activity {
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main3);
// Start service using AlarmManager
Calendar cal = Calendar.getInstance();
cal.add(Calendar.SECOND, 10);
Intent intent = new Intent(Main.this, Service_class.class);
PendingIntent pintent = PendingIntent.getService(Main.this, 0, intent,
0);
AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
36000 * 1000, pintent);
// click listener for the button to start service
Button btnStart = (Button) findViewById(R.id.button1);
btnStart.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
startService(new Intent(getBaseContext(), Service_class.class));
}
});
// click listener for the button to stop service
Button btnStop = (Button) findViewById(R.id.button2);
btnStop.setOnClickListener(new View.OnClickListener() {
#Override
public void onClick(View v) {
stopService(new Intent(getBaseContext(), Service_class.class));
}
});
}}
LOGCAT:
04-15 13:58:49.980: D/AndroidRuntime(1994): Shutting down VM
04-15 13:58:50.000: W/dalvikvm(1994): threadid=1: thread exiting with uncaught exception (group=0x40cc7930)
04-15 13:58:50.000: E/AndroidRuntime(1994): FATAL EXCEPTION: main
04-15 13:58:50.000: E/AndroidRuntime(1994): java.lang.RuntimeException: Unable to create service com.nfc.linked.Service_class: java.lang.NullPointerException
04-15 13:58:50.000: E/AndroidRuntime(1994): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2539)
04-15 13:58:50.000: E/AndroidRuntime(1994): at android.app.ActivityThread.access$1600(ActivityThread.java:141)
04-15 13:58:50.000: E/AndroidRuntime(1994): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
04-15 13:58:50.000: E/AndroidRuntime(1994): at android.os.Handler.dispatchMessage(Handler.java:99)
04-15 13:58:50.000: E/AndroidRuntime(1994): at android.os.Looper.loop(Looper.java:137)
04-15 13:58:50.000: E/AndroidRuntime(1994): at android.app.ActivityThread.main(ActivityThread.java:5041)
04-15 13:58:50.000: E/AndroidRuntime(1994): at java.lang.reflect.Method.invokeNative(Native Method)
04-15 13:58:50.000: E/AndroidRuntime(1994): at java.lang.reflect.Method.invoke(Method.java:511)
04-15 13:58:50.000: E/AndroidRuntime(1994): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
04-15 13:58:50.000: E/AndroidRuntime(1994): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
04-15 13:58:50.000: E/AndroidRuntime(1994): at dalvik.system.NativeStart.main(Native Method)
04-15 13:58:50.000: E/AndroidRuntime(1994): Caused by: java.lang.NullPointerException
04-15 13:58:50.000: E/AndroidRuntime(1994): at com.nfc.linked.Service_class.onCreate(Service_class.java:71)
04-15 13:58:50.000: E/AndroidRuntime(1994): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2529)
04-15 13:58:50.000: E/AndroidRuntime(1994): ... 10 more
04-15 14:00:23.770: D/AndroidRuntime(2047): Shutting down VM
04-15 14:00:23.770: W/dalvikvm(2047): threadid=1: thread exiting with uncaught exception (group=0x40cc7930)
Your method managedQuery() returns null
private Cursor managedQuery(Uri bookmarksUri, String[] projection,
Object object, Object object2, Object object3) {
// TODO Auto-generated method stub
return null;
}}
So when you try to execute a method on null you will get a NullPointerException.
Cursor cursor = managedQuery(android.provider.Browser.BOOKMARKS_URI,
projection, null, null, null); // cursor will be null
String urls = "";
if (cursor.moveToFirst()) { // this will be NPE
Make your managedQuery() method return an instantiated Cursor object.
When i start my app and press stop or pause the android app will crash. It works fine if you press play first and then stop or pause. I searched on google and stackoverflow but i couldn't find much about it. I think the problem is because of a NullPointerException but since i'm new too java it doesn't tell me much about the problem
The code:
import android.app.Activity;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class myMain extends Activity implements
MediaPlayer.OnCompletionListener, MediaPlayer.OnPreparedListener,
MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener, OnClickListener {
private String TAG = getClass().getSimpleName();
private MediaPlayer mp= null;
private Button play;
private Button pause;
private Button stop;
#Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
play = (Button) findViewById(R.id.play);
pause = (Button) findViewById(R.id.pause);
stop = (Button) findViewById(R.id.stop);
play.setOnClickListener(new View.OnClickListener() {
public void onClick(View view) {
play();
}
});
pause.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
pause();
}
});
stop.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
stop();
}
});
}
private void play() {
Uri myUri = Uri.parse("url");
try {
if (mp == null) {
this.mp = new MediaPlayer();
} else {
mp.stop();
mp.reset();
}
mp.setDataSource(this, myUri); // Go to Initialized state
mp.setAudioStreamType(AudioManager.STREAM_MUSIC);
mp.setOnPreparedListener(this);
mp.setOnBufferingUpdateListener(this);
mp.setOnErrorListener(this);
mp.prepareAsync();
Log.d(TAG, "LoadClip Done");
} catch (Throwable t) {
Log.d(TAG, t.toString());
}
}
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "Stream is prepared");
mp.start();
}
private void pause() {
mp.pause();
}
private void stop() {
mp.stop();
}
#Override
public void onDestroy() {
super.onDestroy();
stop();
}
public void onCompletion(MediaPlayer mp) {
stop();
}
public boolean onError(MediaPlayer mp, int what, int extra) {
StringBuilder sb = new StringBuilder();
sb.append("Media Player Error: ");
switch (what) {
case MediaPlayer.MEDIA_ERROR_NOT_VALID_FOR_PROGRESSIVE_PLAYBACK:
sb.append("Not Valid for Progressive Playback");
break;
case MediaPlayer.MEDIA_ERROR_SERVER_DIED:
sb.append("Server Died");
break;
case MediaPlayer.MEDIA_ERROR_UNKNOWN:
sb.append("Unknown");
break;
default:
sb.append(" Non standard (");
sb.append(what);
sb.append(")");
}
sb.append(" (" + what + ") ");
sb.append(extra);
Log.e(TAG, sb.toString());
return true;
}
public void onBufferingUpdate(MediaPlayer mp, int percent) {
Log.d(TAG, "PlayerService onBufferingUpdate : " + percent + "%");
}
public void onClick(View v) {
// TODO Auto-generated method stub
}
}
The errors:
02-11 20:45:43.837: D/AndroidRuntime(338): Shutting down VM
02-11 20:45:43.837: W/dalvikvm(338): threadid=1: thread exiting with uncaught exception (group=0x40015560)
02-11 20:45:43.857: E/AndroidRuntime(338): FATAL EXCEPTION: main
02-11 20:45:43.857: E/AndroidRuntime(338): java.lang.NullPointerException
02-11 20:45:43.857: E/AndroidRuntime(338): at wadio.media.internetradio.myMain.stop(myMain.java:95)
02-11 20:45:43.857: E/AndroidRuntime(338): at wadio.media.internetradio.myMain.access$2(myMain.java:94)
02-11 20:45:43.857: E/AndroidRuntime(338): at wadio.media.internetradio.myMain$3.onClick(myMain.java:55)
02-11 20:45:43.857: E/AndroidRuntime(338): at android.view.View.performClick(View.java:2485)
02-11 20:45:43.857: E/AndroidRuntime(338): at android.view.View$PerformClick.run(View.java:9080)
02-11 20:45:43.857: E/AndroidRuntime(338): at android.os.Handler.handleCallback(Handler.java:587)
02-11 20:45:43.857: E/AndroidRuntime(338): at android.os.Handler.dispatchMessage(Handler.java:92)
02-11 20:45:43.857: E/AndroidRuntime(338): at android.os.Looper.loop(Looper.java:123)
02-11 20:45:43.857: E/AndroidRuntime(338): at android.app.ActivityThread.main(ActivityThread.java:3683)
02-11 20:45:43.857: E/AndroidRuntime(338): at java.lang.reflect.Method.invokeNative(Native Method)
02-11 20:45:43.857: E/AndroidRuntime(338): at java.lang.reflect.Method.invoke(Method.java:507)
02-11 20:45:43.857: E/AndroidRuntime(338): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
02-11 20:45:43.857: E/AndroidRuntime(338): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
02-11 20:45:43.857: E/AndroidRuntime(338): at dalvik.system.NativeStart.main(Native Method)
In your stop() method you access the mp variable. However, the mp variable is null until you press play (and the play() method is called). So when you try to access the null variable a NullPointerException is thrown.
A very simple way to stop the NullPointerException is to do something like this:
private void pause() {
if(mp!=null) mp.pause();
}
private void stop() {
if(mp!=null) mp.stop();
}
Of course this solution doesn't account for cases where pause or stop is called twice. Take a look at the MediaPlayer documentation for more info on state management.