将 Twilio 的传入调用代码从 activity 实施到服务 class 但每次都出错

Implementing Twilio's incoming calling code from activity into Service class but get error each time

在这里,我试图显示一个 Dialog 来电,当我在 activity 中实现时它工作正常,但我想在后台服务中实现以便我可以接听电话任何时候有人打电话。我正在使用 Service 作为后台进程,但由于某些方法,我没有获得适当的成功。当我在服务中实施时,我总是在同一行出错,但在 Activity 中从来没有出错。

我正在从 BROADCASTRECEIVER 启动这项服务

public class BReciever extends BroadcastReceiver {
Context context;

@Override
public void onReceive(Context con, Intent intent) {
    this.context = con;
    intent = new Intent(context, PingService.class);
    context.startService(intent);
    intent = new Intent(context, IncomingCallService.class);
    intent.putExtra("operator_id", "12");
    context.startService(intent);

}

}

我出错的方法是

  public boolean handleIncomingIntent(Intent intent) {
    Device inDevice = intent.getParcelableExtra(Device.EXTRA_DEVICE);
    Connection inConnection = intent
            .getParcelableExtra(Device.EXTRA_CONNECTION);
    if (inDevice == null && inConnection == null)
        return false;

    intent.removeExtra(Device.EXTRA_DEVICE);
    intent.removeExtra(Device.EXTRA_CONNECTION);

    if (pendingIncomingConnection != null) {
        Log.i(TAG, "A pending connection already exists");
        inConnection.ignore();
        return false;
    }

    pendingIncomingConnection = inConnection;
    pendingIncomingConnection.setConnectionListener(this);

    return true;
}

当我通过 Service.

调用此方法时,我总是在 DeviceConnection 中得到 null

服务class

public class IncomingCallService extends Service implements LoginListener,
    BasicConnectionListener, BasicDeviceListener, View.OnClickListener,
    CompoundButton.OnCheckedChangeListener,
    RadioGroup.OnCheckedChangeListener {

private static Handler handler;
public BasicPhone phone;
BasicPhoneActivity call_screen;
SharedPreferences login_details;
Vibrator vibrator;
Ringtone r;
private AlertDialog incomingAlert;
Uri notification;
public static final String LOGIN_DETAILS = "u18_sales_logins_details";
AudioManager am;
Intent intent;
static String Twilio_id = "",
        INCOMING_AUTH_PHP_SCRIPT = "http://example.com/client_generate_token?users_id=";
Runnable newrun;
Activity context;
Context ctx;

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {
    login_details = getSharedPreferences(LOGIN_DETAILS,
            Context.MODE_PRIVATE);
    if (login_details.contains("twilio_Id")) {
        Twilio_id = login_details.getString("twilio_Id", "");
    }
    phone = BasicPhone.getInstance(getApplicationContext());
    phone.setListeners(this, this, this);
    new IncomingTokenTask().execute();
    onCallHandler();
    Log.d("toekn", BasicPhone.capabilityToken);
}

@Override
public void onDestroy() {
    super.onDestroy();
    if (phone != null) {
        phone.setListeners(null, null, null);
        phone = null;
    }
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // TODO Auto-generated method stub
    op_id = (String) intent.getExtras().get("operator_id");
    if (null != intent) {
                if (phone.handleIncomingIntent(intent)) {
                    showIncomingAlert();
                }
            }
    return START_STICKY;
}

private void showIncomingAlert() {

    handler.post(new Runnable() {
        @Override
        public void run() {
            if (incomingAlert == null) {
                notification = RingtoneManager
                        .getDefaultUri(RingtoneManager.TYPE_RINGTONE);
                r = RingtoneManager.getRingtone(getApplicationContext(),
                        notification);
                am = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
                switch (am.getRingerMode()) {
                case AudioManager.RINGER_MODE_SILENT:
                    r.play();
                    break;
                case AudioManager.RINGER_MODE_VIBRATE:
                    long pattern[] = { 0, 500, 200, 300, 500 };
                    vibrator.vibrate(pattern, 0);
                    break;
                case AudioManager.RINGER_MODE_NORMAL:
                    r.play();
                    break;
                }
                incomingAlert = new AlertDialog.Builder(
                        getApplicationContext())
                        .setTitle(R.string.incoming_call)
                        .setCancelable(false)
                        .setMessage(R.string.incoming_call_message)
                        .setPositiveButton(R.string.answer,
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(
                                            DialogInterface dialog,
                                            int which) {
                                        switch (am.getRingerMode()) {
                                        case AudioManager.RINGER_MODE_SILENT:
                                            r.stop();
                                            break;
                                        case AudioManager.RINGER_MODE_VIBRATE:
                                            vibrator.cancel();
                                            break;
                                        case AudioManager.RINGER_MODE_NORMAL:
                                            r.stop();
                                            break;
                                        }
                                        phone.acceptConnection();
                                        incomingAlert = null;
                                    }
                                })
                        .setNegativeButton(R.string.ignore,
                                new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(
                                            DialogInterface dialog,
                                            int which) {
                                        switch (am.getRingerMode()) {
                                        case AudioManager.RINGER_MODE_SILENT:
                                            r.stop();
                                            break;
                                        case AudioManager.RINGER_MODE_VIBRATE:
                                            vibrator.cancel();
                                            break;
                                        case AudioManager.RINGER_MODE_NORMAL:
                                            r.stop();
                                            break;
                                        }
                                        phone.ignoreIncomingConnection();
                                        incomingAlert = null;
                                    }
                                })
                        .setOnCancelListener(
                                new DialogInterface.OnCancelListener() {
                                    @Override
                                    public void onCancel(
                                            DialogInterface dialog) {
                                        phone.ignoreIncomingConnection();
                                    }
                                }).create();
                incomingAlert.show();
            }
        }
    });
}

private void hideIncomingAlert() {
    handler.post(new Runnable() {
        @Override
        public void run() {

            if (incomingAlert != null) {
                incomingAlert.dismiss();
                incomingAlert = null;
            }
        }
    });
}

public void onCallHandler() {

    // TODO Auto-generated method stub

    handler = new Handler();
    newrun = new Runnable() {

        @Override
        public void run() {
            handler.removeCallbacks(newrun);
            new IncomingTokenTask().execute();
               if (null != intent) {
                if (phone.handleIncomingIntent(intent)) {
                    showIncomingAlert();
                }
            }
            handler.postDelayed(this, 200000);
        }
    };
    handler.postDelayed(newrun, 80000);

}

class IncomingTokenTask extends AsyncTask<Void, Void, Void> {
    String message;
    JSONObject jsonResponse;
    int crash_app;

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected Void doInBackground(Void... params) {
        HostnameVerifier hostnameVerifier = org.apache.http.conn.ssl.SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
        DefaultHttpClient httpclient = new DefaultHttpClient();
        SchemeRegistry registry = new SchemeRegistry();
        SSLSocketFactory socketFactory = SSLSocketFactory
                .getSocketFactory();
        socketFactory
                .setHostnameVerifier((X509HostnameVerifier) hostnameVerifier);
        registry.register(new Scheme("https", socketFactory, 443));
        SingleClientConnManager mgr = new SingleClientConnManager(
                httpclient.getParams(), registry);
        @SuppressWarnings("unused")
        DefaultHttpClient httpClient = new DefaultHttpClient(mgr,
                httpclient.getParams());
        // Set verifier
        HttpsURLConnection.setDefaultHostnameVerifier(hostnameVerifier);// Create
                                                                        // new
                                                                        // HTTP
                                                                        // POST
                                                                        // with
                                                                        // URL
                                                                        // to
                                                                        // php
                                                                        // file
                                                                        // as
                                                                        // parameter

        HttpGet httppost = new HttpGet(INCOMING_AUTH_PHP_SCRIPT + Twilio_id);
        try {
            HttpResponse response = httpclient.execute(httppost);
            if (response.getStatusLine().getStatusCode() == 200) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    BasicPhone.capabilityToken = EntityUtils
                            .toString(entity);
                    BasicPhone.decodedString = BasicPhone.capabilityToken
                            .replace("\"", "");
                }
            }
        } catch (Exception e) {
            crash_app = 5;
            message = "Something went wrong. Please try again later.";
            return null;
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
    }
}

@Override
public void onCheckedChanged(RadioGroup arg0, int arg1) {
    // TODO Auto-generated method stub

}

@Override
public void onCheckedChanged(CompoundButton arg0, boolean arg1) {
    // TODO Auto-generated method stub

}

@Override
public void onClick(View arg0) {
    // TODO Auto-generated method stub

}

@Override
public void onDeviceStartedListening() {
    // TODO Auto-generated method stub

}

@Override
public void onDeviceStoppedListening(Exception error) {
    // TODO Auto-generated method stub

}

@Override
public void onIncomingConnectionDisconnected() {
    hideIncomingAlert();
}

@Override
public void onConnectionConnecting() {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionConnected() {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionFailedConnecting(Exception error) {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionDisconnecting() {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionDisconnected() {
    // TODO Auto-generated method stub

}

@Override
public void onConnectionFailed(Exception error) {
    // TODO Auto-generated method stub

}

@Override
public void onLoginStarted() {
    // TODO Auto-generated method stub

}

@Override
public void onLoginFinished() {
    // TODO Auto-generated method stub

}

@Override
public void onLoginError(Exception error) {
    // TODO Auto-generated method stub

}

}

而logcat是

07-16 00:12:56.305: E/AndroidRuntime(1104): FATAL EXCEPTION: main
07-16 00:12:56.305: E/AndroidRuntime(1104): Process: com.u18.enroll, PID: 1104
07-16 00:12:56.305: E/AndroidRuntime(1104): java.lang.NullPointerException
07-16 00:12:56.305: E/AndroidRuntime(1104):     at com.u18.enroll.BasicPhone.handleIncomingIntent(BasicPhone.java:290)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at com.u18.enroll.IncomingCallService.run(IncomingCallService.java:217)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at android.os.Handler.handleCallback(Handler.java:733)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at android.os.Handler.dispatchMessage(Handler.java:95)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at android.os.Looper.loop(Looper.java:136)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at android.app.ActivityThread.main(ActivityThread.java:5017)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at java.lang.reflect.Method.invokeNative(Native Method)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at java.lang.reflect.Method.invoke(Method.java:515)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
07-16 00:12:56.305: E/AndroidRuntime(1104):     at dalvik.system.NativeStart.main(Native Method)

我总是在第一个条件下出错。谁能帮我解决一下?

I always get null in Device and Connection when I call this method via Service.

当然可以。这是您在 IncomingCallService:

上调用 startService() 的代码
intent = new Intent(context, IncomingCallService.class);
context.startService(intent);

您会注意到您没有在此 Intent 上添加任何额外内容。因此,当您尝试将它们从 Intent 交付给 onStartCommand() 中的服务中拉出时,将不会有任何额外内容。如果你想在这个 Intent 上添加额外内容,你需要输入 putExtra() 调用。

所以我在服务中添加一行就解决了我的问题class

        phone.login(DEFAULT_CLIENT_NAME, true, true);