Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过编程拨打电话后,我的android应用程序崩溃_Java_Android - Fatal编程技术网

Java 通过编程拨打电话后,我的android应用程序崩溃

Java 通过编程拨打电话后,我的android应用程序崩溃,java,android,Java,Android,标题解释了所有。。。我的应用程序中有以下代码片段: String url = createTelUrl("3112007315"); Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse(url)); context.startActivity(intent); 它确实进行了调用,但一旦调用结束,我的应用程序就会崩溃。我想在通话结束后返回我的应用程序,但我读了一遍,似乎不可能。所以是否至少需要暂停我的应

标题解释了所有。。。我的应用程序中有以下代码片段:

String url = createTelUrl("3112007315");
Intent intent = new Intent(Intent.ACTION_CALL);
intent.setData(Uri.parse(url));
context.startActivity(intent);
它确实进行了调用,但一旦调用结束,我的应用程序就会崩溃。我想在通话结束后返回我的应用程序,但我读了一遍,似乎不可能。所以是否至少需要暂停我的应用程序并在通话结束后恢复

编辑:

谢谢你给我的两个答案,我觉得我真的离我的目标很近了。。。我已经做了你们建议的一些事情。但是,也许我没有解释申请的一些细节。。。我正在开发谁想成为Millonarie游戏,所以我需要实现调用(我不知道在美国或其他国家如何调用,但在这里我们称之为“调用朋友”)

无论如何。。。我对这个应用做了太多更改,现在它没有崩溃。但是,一旦调用结束,我绘制UI的画布就不会显示

我有一个保存UI的
SurfaceView
。为此,
SurfaceView
我创建了一个用于刷新UI的线程。。。这就是线程的基本功能:

@Override
public void run() {
    Canvas c;
    while (_run) {
        c = null;
        try {
            c = _surfaceHolder.lockCanvas(null);
            // Check if should wait
            synchronized (_surfaceHolder) {
                _panel.onDraw(c);
            }
        } finally {
            // do this in a finally so that if an exception is thrown
            // during the above, we don't leave the Surface in an
            // inconsistent state
            if (c != null) {
                _surfaceHolder.unlockCanvasAndPost(c);
            }
        }
    }
}
但是,一旦通话结束,我就会看到一个黑屏。表面在那里(我知道它,因为它仍然可以接收一些触摸事件),但它没有显示任何东西。另一个需要考虑的问题是如何从
SurfaceView
类启动线程:

public void surfaceCreated(SurfaceHolder holder) {
    hilo.setRunning(true);
    try{
        hilo.start();
    }catch(IllegalThreadStateException ite){
        Log.e("wwtbam", "god dammed");
    }
}
这在我开始打电话之前效果很好。这里的问题是,一旦调用结束并再次执行start方法,就会抛出一个
IllegalThreadStateException
,因为线程已经启动了。我尝试过在调用时使用一些“技术”来暂停UI线程,但我一直无法解决这个问题。我试过这样做:

// this in the UI thread class
if(haveToWait)
    wait();
....
// this in the surface view class
if(callEnded)
    hilo.notify();
但那没用。我还尝试过其他一些“技巧”,比如使用
sleep(50)而不是
wait()但它也不起作用


根据我提供的所有信息。。。你能给我什么建议吗?

关于崩溃-请发布日志,并将调试器放在Start/onResume上,以了解崩溃的原因。有可能是某些内容在错误的位置初始化,您可能需要一些像nullpointer这样简单的内容

至于通话结束的事情,我从来没有尝试过,但我会尝试注册接收者,接住 评估手机的状态,然后做你需要做的事情

这里还有更多信息


最后,您将在source.android.com中找到如何在使用该功能的应用程序中使用该功能的示例。对于崩溃,请发布日志并将调试器置于start/onResume上,以了解崩溃的原因。有可能是某些内容在错误的位置初始化,您可能需要一些像nullpointer这样简单的内容

至于通话结束的事情,我从来没有尝试过,但我会尝试注册接收者,接住 评估手机的状态,然后做你需要做的事情

这里还有更多信息


最后,您将在source.android.com

中找到如何在使用该功能的应用程序中使用该功能的示例,这可以使用
android.telephony.PhoneStateListener

首先,我们需要处理应用程序的清单:

我们需要打电话的许可(duh!)以及查看手机状态的许可。后者是必需的,这样应用程序也可以对通话结束做出反应。因此,我们将这些行添加到out应用程序清单中:

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
准备好清单中的所有内容后,我们现在可以查看进行调用的活动:

public class CallTest extends Activity {
    PhoneStateListener mListener;
    TelephonyManager mTelMgr;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mListener = new CallEndedListener();
        mTelMgr = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
    }

    public void makecall(View v) {
        // Register our listener to be notified of the beginning
        // and ending of calls
        mTelMgr.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);

        // Start the call
        Intent call = new Intent(Intent.ACTION_CALL);
        call.setData(Uri.parse("tel:12345"));
        startActivity(call);
    }

    class CallEndedListener extends PhoneStateListener {
        boolean called = false;

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);

            // Don't fire before the call was made
            if (state == TelephonyManager.CALL_STATE_OFFHOOK)
                called = true;

            // Call has ended -- now bring the activity back to front
            if (called && state == TelephonyManager.CALL_STATE_IDLE) {
                called = false;
                mTelMgr.listen(this, PhoneStateListener.LISTEN_NONE);
                startActivity(new Intent(CallTest.this, CallTest.class));
            }
        }
    }
}
与问题中的代码片段相比,
makecall
方法中唯一的新功能是在实际进行调用之前添加的
PhoneStateListener
实现。然后,当拨出电话、来电铃声响起或活动通话结束时,Android会通知此侦听器

我们的实现等待后一个
CALL\u STATE\u IDLE
事件,然后再次开始我们的活动,这样在调用结束后,我们就回到了我们离开它的应用程序中。然后,它会注销自身,因此,我们的活动不会在用户每次结束一个不是由我们自己的活动发起的调用时重新启动

然而,当使用
TelephonyManager
注册CALL_STATE-events时,Android会立即发出一个当前状态的通知,这样我们的侦听器就可以在调用开始之前被触发。因此,我们的侦听器实现首先等待,直到传出呼叫启动(
call\u STATE\u OFFHOOK
),然后才对
call\u STATE\u IDLE
通知作出反应


这可以使用android.telephony.PhoneStateListener
实现

首先,我们需要处理应用程序的清单:

我们需要打电话的许可(duh!)以及查看手机状态的许可。后者是必需的,这样应用程序也可以对通话结束做出反应。因此,我们将这些行添加到out应用程序清单中:

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
准备好清单中的所有内容后,我们现在可以查看进行调用的活动:

public class CallTest extends Activity {
    PhoneStateListener mListener;
    TelephonyManager mTelMgr;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mListener = new CallEndedListener();
        mTelMgr = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
    }

    public void makecall(View v) {
        // Register our listener to be notified of the beginning
        // and ending of calls
        mTelMgr.listen(mListener, PhoneStateListener.LISTEN_CALL_STATE);

        // Start the call
        Intent call = new Intent(Intent.ACTION_CALL);
        call.setData(Uri.parse("tel:12345"));
        startActivity(call);
    }

    class CallEndedListener extends PhoneStateListener {
        boolean called = false;

        @Override
        public void onCallStateChanged(int state, String incomingNumber) {
            super.onCallStateChanged(state, incomingNumber);

            // Don't fire before the call was made
            if (state == TelephonyManager.CALL_STATE_OFFHOOK)
                called = true;

            // Call has ended -- now bring the activity back to front
            if (called && state == TelephonyManager.CALL_STATE_IDLE) {
                called = false;
                mTelMgr.listen(this, PhoneStateListener.LISTEN_NONE);
                startActivity(new Intent(CallTest.this, CallTest.class));
            }
        }
    }
}
与问题中的代码片段相比,
makecall
方法中唯一的新功能是在实际进行调用之前添加的
PhoneStateListener
实现。然后,当拨出电话、来电铃声响起或活动通话结束时,Android会通知此侦听器

我们的实现等待后一个
CALL\u STATE\u IDLE
事件,然后再次开始我们的活动,这样在调用结束后,我们就回到了我们离开它的应用程序中。然后,它会注销自身,因此,我们的活动不会在用户每次结束一个不是由我们自己的活动发起的调用时重新启动

但是,在注册CALL_STATE-e时