У меня серьезная проблема, я разрабатываю приложение, которое отслеживает время разговора во время разговора; проблема возникает, когда с телефоном на ухе нить, которую имеет таймер, блокирует и больше не отвечает перед тем, как снять мое ухо. Следующий журнал показывает проблему.
01-11 16: 14: 19.607 14558 14566 I Estado: PostDlaylayed Async Service
01-11 16: 14: 20.607 14558 14566 I Estado: PostDlaylayed Async Service
01-11 16: 14: 21.607 14558 14566 I Estado: PostDlaylayed Async Service
01-11 16: 14: 22.597 14558 14566 I Estado: PostDlaylayed Async Service
01-11 16: 14: 23.608 14558 14566 I Estado: PostSlayeded Async Service
01-11 16: 14: 24.017 1106 1106 D iddd: select () <0, возможно обработанный сигнал: прерван системный вызов </p>
01-11 16: 14: 24.607 14558 14566 I Estado: Асинхронная служба с отложенной задержкой
01-11 16: 18: 05.500 1106 1106 D iddd: select () <0, возможно обработанный сигнал: прерван системный вызов </p>
01-11 16: 18: 06.026 14558 14566 I Estado: PostSlayeded Async Service
01-11 16: 18: 06.026 14558 14566 I Estado: PostDlaylayed Async Service
01-11 16: 18: 06.026 14558 14566 I Estado: PostSlayeded Async Service
01-11 16: 18: 06.026 14558 14566 I Estado: PostSlayeded Async Service
01-11 16: 18: 06.026 14558 14566 I Estado: PostSlayeded Async Service
01-11 16: 18: 06.026 14558 14566 I Estado: PostSlayeded Async Service
Я пробовал использовать службы, таймеры, потоки, AyncTasks, и все они представляют одну и ту же проблему.
Мой код:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
setContentView(R.layout.main);
HangUpService.setMainActivity(this);
objHangUpService = new Intent(this, HangUpService.class);
Runnable rAccion = new Runnable() {
public void run() {
TelephonyManager tm = (TelephonyManager)getSystemService(TELEPHONY_SERVICE);
tm.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE);
objVibrator = (Vibrator) getSystemService(getApplicationContext().VIBRATOR_SERVICE);
final ListView lstLlamadas = (ListView) findViewById(R.id.lstFavoritos);
final EditText txtMinutos = (EditText) findViewById(R.id.txtMinutos);
final EditText txtSegundos = (EditText) findViewById(R.id.txtSegundos);
ArrayList<Contacto> cContactos = new ArrayList<Contacto>();
ContactoAdapter caContactos = new ContactoAdapter(HangUp.this, R.layout.row,cContactos);
Cursor curContactos = getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI,
null,
null,
null,
ContactsContract.Contacts.TIMES_CONTACTED + " DESC");
while (curContactos.moveToNext()){
String strNombre = curContactos.getString(curContactos.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String strID = curContactos.getString(curContactos.getColumnIndex(ContactsContract.Contacts._ID));
String strHasPhone=curContactos.getString(curContactos.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
String strStarred=curContactos.getString(curContactos.getColumnIndex(ContactsContract.Contacts.STARRED));
if (Integer.parseInt(strHasPhone) > 0 && Integer.parseInt(strStarred) ==1 ) {
Cursor CursorTelefono = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = " + strID,
null, null);
while (CursorTelefono.moveToNext()) {
String strTipo=CursorTelefono.getString(CursorTelefono.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
String strTelefono=CursorTelefono.getString(CursorTelefono.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
strNumero=strTelefono;
String args[]=new String[1];
args[0]=strNumero;
Cursor CursorCallLog = getContentResolver().query(
android.provider.CallLog.Calls.CONTENT_URI,
null,
android.provider.CallLog.Calls.NUMBER + "=?",
args,
android.provider.CallLog.Calls.DATE+ " DESC");
if (Integer.parseInt(strTipo)==2)
{
caContactos.add(
new Contacto(
strNombre,
strTelefono
)
);
}
}
CursorTelefono.close();
}
}
curContactos.close();
lstLlamadas.setAdapter(caContactos);
lstLlamadas.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView a, View v, int position, long id) {
Contacto mContacto=(Contacto)lstLlamadas.getItemAtPosition(position);
i = new Intent(HangUp.this, Llamada.class);
Log.i("Estado","Declaro Intent");
Bundle bundle = new Bundle();
bundle.putString("telefono", mContacto.getTelefono());
i.putExtras(bundle);
startActivityForResult(i,SUB_ACTIVITY_ID);
Log.i("Estado","Inicio Intent");
blActivo=true;
try {
String strMinutos=txtMinutos.getText().toString();
String strSegundos=txtSegundos.getText().toString();
if(!strMinutos.equals("") && !strSegundos.equals("")){
int Tiempo = (
(Integer.parseInt(txtMinutos.getText().toString())*60) +
Integer.parseInt(txtSegundos.getText().toString())
)* 1000;
handler.removeCallbacks(rVibrate);
cTime = System.currentTimeMillis();
cTime=cTime+Tiempo;
objHangUpAsync = new HangUpAsync(cTime,objVibrator,objPowerManager,objKeyguardLock);
objHangUpAsync.execute();
objPowerManager.userActivity(Tiempo+3000, true);
objHangUpService.putExtra("cTime", cTime);
//startService(objHangUpService);
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
});
}
};
}
AsyncTask:
@Override
protected String doInBackground(String... arg0) {
blActivo = true;
mWakeLock = objPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK, "My Tag");
objKeyguardLock.disableKeyguard();
Log.i("Estado", "Entro a doInBackground");
timer.scheduleAtFixedRate(
new TimerTask() {
public void run() {
if (blActivo){
if (cTime<System.currentTimeMillis()){
blActivo=false;
objVibrator.vibrate(1000);
Log.i("Estado","Vibrar desde Async");
this.cancel();
}else{
try{
mWakeLock.acquire();
mWakeLock.release();
Log.i("Estado","postDelayed Async Service");
}catch(Exception e){
Log.i("Estado","Error: " + e.getMessage());
}
}
}
}
}, 0, INTERVAL);
return null;
}