Attend XDA's Second Annual Developer Conference, XDA:DevCon 2014!
5,771,111 Members 48,897 Now Online
XDA Developers Android and Mobile Development Forum

[Q] java.lang.NullPointerException in Android Webservice

Tip us?
 
FedePrado
Old
#1  
Junior Member - OP
Thanks Meter 0
Posts: 5
Join Date: Feb 2014
Question [Q] java.lang.NullPointerException in Android Webservice

Hello everyone, me again.

I am having a little issue with my android app.

When I run the service on the phone, it starts just fine and when the call is disconnected it throws an java.lang.NullPointerException when i start the tareaEnviarABD.execute(); task.

This is the code of my service:

Code:
 package com.trucka.llamadasdrivers;
    
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.Calendar;
    import java.util.Date;
    
    import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.PropertyInfo;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.HttpTransportSE;
    
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.app.Service;
    import android.content.Context;
    import android.content.Intent;
    import android.database.Cursor;
    import android.net.Uri;
    import android.os.AsyncTask;
    import android.os.IBinder;
    import android.provider.CallLog;
    import android.telephony.PhoneStateListener;
    import android.telephony.TelephonyManager;
    import android.util.Log;
    import android.widget.TextView;
    import android.widget.Toast;
    
    public class ServicioLlamadas extends Service {
    	
    	TextView txtInformacion = null;
    	TextView txtDetalles = null;
    	TextView tv = null;
    	
    	private String resultado;
    	String phNumber = null;
    	String callType = null;
    	String callDate = null;
    	DateFormat shortFecha = null;
    	DateFormat shortDF = null;
    	Date callDayTime = null;
    	Date fin = null;
    	String fechaLlamada1 = null;
    	String fechaLlamada2 = null;
    	String callDuration = null;
    	String dir = null;
    	public String tolo = null;
    	String imei = null;
    	String comentario = null;
    	String fechaRegistro = null;
    	String insercion = null;
    	String fechaInicio = null;
    	String fechaFin = null;
    	String estadoLlamada = null;
    
    	private static ServicioLlamadas instance = null;
    
    	public static boolean isRunning() {
    		return instance != null;
    	}
    
    	@Override
    	public IBinder onBind(Intent intent) {
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		Toast.makeText(getApplicationContext(), "Servicio TRUCKA creado",
    				Toast.LENGTH_SHORT).show();
    		instance = this;
    	}
    
    	@Override
    	public void onDestroy() {
    		Toast.makeText(getApplicationContext(), "Servicio TRUCKA destruído",
    				Toast.LENGTH_SHORT).show();
    		instance = null;
    	}
    
    	@Override
    	public void onStart(Intent intent, int startid) {
    		Toast.makeText(getApplicationContext(), "Servicio TRUCKA iniciado",
    				Toast.LENGTH_SHORT).show();
    		TelephonyManager TelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    		TelephonyMgr.listen(new TeleListener(),
    				PhoneStateListener.LISTEN_CALL_STATE);
    	}
    	
    class TeleListener extends PhoneStateListener {
    		
    		@Override
    		public void onCallStateChanged(int state, String incomingNumber) {
    			super.onCallStateChanged(state, incomingNumber);
    			switch (state) {
    			case TelephonyManager.CALL_STATE_IDLE:
    				if (estadoLlamada == "OFFHOOK") {
    					insercion = null;
    					getCallDetails();
    					Toast.makeText(getApplicationContext(),
    							"Información enviada.", Toast.LENGTH_SHORT).show();
    				}
    				estadoLlamada = "IDLE";
    				break;
    			case TelephonyManager.CALL_STATE_OFFHOOK:
    				estadoLlamada = "OFFHOOK";
    				Toast.makeText(getApplicationContext(),
    						"Enviando información...", Toast.LENGTH_SHORT).show();
    				break;
    			case TelephonyManager.CALL_STATE_RINGING:
    				break;
    			default:
    				break;
    			}
    		}
    	}
    
    //Obtener la fecha actual del teléfono.
    	public long getTodayTimestamp() {
    		Calendar c1 = Calendar.getInstance();
    		c1.setTime(new Date());
    
    		Calendar c2 = Calendar.getInstance();
    		c2.set(Calendar.YEAR, c1.get(Calendar.YEAR));
    		c2.set(Calendar.MONTH, c1.get(Calendar.MONTH));
    		c2.set(Calendar.DAY_OF_MONTH, c1.get(Calendar.DAY_OF_MONTH));
    		c2.set(Calendar.HOUR_OF_DAY, 0);
    		c2.set(Calendar.MINUTE, 0);
    		c2.set(Calendar.SECOND, 0);
    
    		return c2.getTimeInMillis();
    	}
    
    private void getCallDetails() {
    	String timestamp = String.valueOf(getTodayTimestamp());
    	StringBuffer sb = new StringBuffer();
    	Cursor managedCursor = getContentResolver().query(CallLog.Calls.CONTENT_URI, null,
    			CallLog.Calls.DATE + ">= ?", new String[] { timestamp }, null);
    	int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER);
    	int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE);
    	int date = managedCursor.getColumnIndex(CallLog.Calls.DATE);
    	int duration = managedCursor.getColumnIndex(CallLog.Calls.DURATION);
    	sb.append("Bitácora de llamadas :");
    	 //managedCursor.moveToFirst();
    	managedCursor.moveToLast();
    	phNumber = managedCursor.getString(number);
    	callType = managedCursor.getString(type);
    	callDate = managedCursor.getString(date);
    	shortFecha = DateFormat.getDateInstance(DateFormat.SHORT);
    	shortDF = DateFormat.getTimeInstance(DateFormat.SHORT);
    	callDayTime = new Date(Long.valueOf(callDate));
    	fechaLlamada1 = shortDF.format(callDayTime);
    	fechaLlamada2 = shortFecha.format(callDayTime);
    	callDuration = managedCursor.getString(duration);
    	int dircode = Integer.parseInt(callType);
    	TelephonyManager mngr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
    	switch (dircode) {
    	case CallLog.Calls.OUTGOING_TYPE:
    		dir = "Saliente";
    		break;
    
    	case CallLog.Calls.INCOMING_TYPE:
    		dir = "Entrante";
    		break;
    
    	case CallLog.Calls.MISSED_TYPE:
    		dir = "Perdida";
    		break;
    	}
    
    	imei = mngr.getDeviceId();
    	comentario = dir;
    	fechaRegistro = fechaLlamada2;
    	DateFormat df = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
    	String ahorita = df.format(callDayTime);
    	fechaInicio = ahorita.toString();
    
    	insercion = "DECLARE @claveDriver INT, @nombreDriver VARCHAR(max), @evento VARCHAR(max), @duracion int, @inicial varchar(max) "
    			+ "SET @claveDriver = (SELECT cve_tra FROM SISTEMA.dbo.TELEFONOS WHERE IMEI_SIM = '"
    			+ mngr.getDeviceId()
    			+ "') "
    			+ "SET @nombreDriver = (SELECT nombre FROM SISTEMA.dbo.TELEFONOS WHERE IMEI_SIM = '"
    			+ mngr.getDeviceId()
    			+ "') "
    			+ "SET @duracion = "
    			+ managedCursor.getString(duration)
    			+ "SET @evento = '(LOG) Llamada "
    			+ dir
    			+ ". Duración ' + CONVERT(varchar, @duracion, 103) + ' segundos al número: "
    			+ managedCursor.getString(number)
    			+ "' "
    			+ " SET @inicial = '"
    			+ fechaInicio
    			+ "'"
    			+ "INSERT INTO bitacora.dbo.registroDellamadasOperadores (fechacreacion,fecha_fin,fecha_inicio,idMobil,Tractor,Nom_tra,Cve_tra,FechaRegistro,Evento) "
    			+ " VALUES('"
    			+ fechaInicio
    			+ "', DATEADD(SECOND,@duracion,@inicial),'"
    			+ fechaInicio
    			+ "','"
    			+ mngr.getDeviceId()
    			+ "','',@nombreDriver,@claveDriver,current_timestamp,@evento)";
    	try
    	{
    	AsyncCallWS tareaEnviarABD = new AsyncCallWS();
    	tareaEnviarABD.execute();
    	}catch(Exception e){
    		Toast.makeText(getApplicationContext(),
    				e.toString(), Toast.LENGTH_SHORT).show();
    	}
    }
    
    private class AsyncCallWS extends AsyncTask<Void, Void, Void> {
    	@Override
    	protected Void doInBackground(Void... params) {
    		Log.i(TAG, "doInBackground");
    		InsertarLlamada(insercion);
    		return null;
    	}
    
    	@Override
    	protected void onPostExecute(Void result) {
    		Log.i(TAG, "onPostExecute");
    		txtInformacion.setText("Información enviada");
    	}
    
    	@Override
    	protected void onPreExecute() {
    		Log.i(TAG, "onPreExecute");
    		txtInformacion.setText("Enviando información...");
    	}
    
    	@Override
    	protected void onProgressUpdate(Void... values) {
    		Log.i(TAG, "onProgressUpdate");
    	}
    }
    public void InsertarLlamada(String insercion) {
    	// Creamos la solicitud
    	SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    	// Propiedades que contienen los valores
    	PropertyInfo propiedades = new PropertyInfo();
    
    	propiedades.setName("insercion");
    	propiedades.setValue(insercion);
    	propiedades.setType(String.class);
    	// Agregamos las propiedades
    	request.addProperty(propiedades);
    	// Creamos el envelope
    	SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
    			SoapEnvelope.VER11);
    	envelope.dotNet = true;
    	// ponemos la salida SOAP
    	envelope.setOutputSoapObject(request);
    	// Creamos la llamada HTTP
    	HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
    
    	try {
    		// Invocamos el servicio
    		androidHttpTransport.call(SOAP_ACTION, envelope);
    		// Obtenemos la respuesta
    		Object response = envelope.getResponse();
    		// Asignamos el resultado de la consulta
    		resultado = response.toString();
    	} catch (Exception e) {
    		Toast.makeText(getApplicationContext(),
    				e.toString(), Toast.LENGTH_SHORT).show();
    	}
    }
    }
And the log cat shows this:

Code:
 02-25 09:32:32.946: D/ActivityThread(8866): setTargetHeapUtilization:0.25
    02-25 09:32:32.946: D/ActivityThread(8866): setTargetHeapIdealFree:8388608
    02-25 09:32:32.946: D/ActivityThread(8866): setTargetHeapConcurrentStart:2097152
    02-25 09:33:07.663: D/libEGL(8866): loaded /system/lib/egl/libEGL_adreno200.so
    02-25 09:33:07.663: D/libEGL(8866): loaded /system/lib/egl/libGLESv1_CM_adreno200.so
    02-25 09:33:07.663: D/libEGL(8866): loaded /system/lib/egl/libGLESv2_adreno200.so
    02-25 09:33:07.683: I/Adreno200-EGLSUB(8866): <ConfigWindowMatch:2087>: Format RGBA_8888.
    02-25 09:33:07.693: E/(8866): <s3dReadConfigFile:75>: Can't open file for reading
    02-25 09:33:07.693: E/(8866): <s3dReadConfigFile:75>: Can't open file for reading
    02-25 09:33:07.693: D/OpenGLRenderer(8866): Enabling debug mode 0
    02-25 09:33:13.128: I/TRUCKA_DRIVERS(8866): onPreExecute
    02-25 09:33:13.128: D/AndroidRuntime(8866): Shutting down VM
    02-25 09:33:13.128: W/dalvikvm(8866): threadid=1: thread exiting with uncaught exception (group=0x41e48438)
    02-25 09:33:13.128: E/AndroidRuntime(8866): FATAL EXCEPTION: main
    02-25 09:33:13.128: E/AndroidRuntime(8866): java.lang.NullPointerException
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at com.trucka.llamadasdrivers.ServicioLlamadas$AsyncCallWS.onPreExecute(ServicioLlamadas.java:239)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at android.os.AsyncTask.execute(AsyncTask.java:534)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at com.trucka.llamadasdrivers.ServicioLlamadas.getCallDetails(ServicioLlamadas.java:215)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at com.trucka.llamadasdrivers.ServicioLlamadas.access$0(ServicioLlamadas.java:143)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at com.trucka.llamadasdrivers.ServicioLlamadas$TeleListener.onCallStateChanged(ServicioLlamadas.java:108)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at android.telephony.PhoneStateListener$2.handleMessage(PhoneStateListener.java:421)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at android.os.Looper.loop(Looper.java:137)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at android.app.ActivityThread.main(ActivityThread.java:5062)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at java.lang.reflect.Method.invokeNative(Native Method)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at java.lang.reflect.Method.invoke(Method.java:511)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
    02-25 09:33:13.128: E/AndroidRuntime(8866): 	at dalvik.system.NativeStart.main(Native Method)
    02-25 09:33:14.240: I/Process(8866): Sending signal. PID: 8866 SIG: 9
Can someone please tell me what am I doing wrong?

Thanks!
 
deanwray
Old
(Last edited by deanwray; 26th February 2014 at 08:14 PM.)
#2  
deanwray's Avatar
Senior Member
Thanks Meter 417
Posts: 1,120
Join Date: Apr 2006

 
DONATE TO ME
Quote:
Originally Posted by FedePrado View Post
Hello everyone, me again.
Code:
 
    	@Override
    	protected void onPreExecute() {
    		Log.i(TAG, "onPreExecute");
    		txtInformacion.setText("Enviando información...");
    	}
02-25 09:33:13.128: E/AndroidRuntime(8866): java.lang.NullPointerException
02-25 09:33:13.128: E/AndroidRuntime(8866): at com.trucka.llamadasdrivers.ServicioLlamadas$AsyncC allWS.onPreExecute(ServicioLlamadas.java:239)
it tells you there, note that on line 239 you are asking an object (in this case "txtInfromacion") to execute one of it's methods, but the object is actually "null" so it throws the exception

disclaimer, I only looked at it for 10 seconds cause busy but I would think there is a 99.5% chance I'm correct

EDIT : ok looked at it another 5 seconds, you never assign anything to that TextView, like associating it with the view on screen ? eg. findViewById(R.id.someID)
Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes