重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
新建一个Android工程,取名为TestCallphone
成都创新互联专注于伊吾企业网站建设,成都响应式网站建设公司,商城建设。伊吾网站建设公司,为伊吾等地区提供建站服务。全流程按需网站建设,专业设计,全程项目跟踪,成都创新互联专业和态度为您提供的服务
打开res|layout|activity_main.xml
编辑activity_main.xml,添加如下代码:
Button android:id="@+id/btn_call" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="直接呼叫联通客服10010" /
打开MainActivity.java,并编辑,添加如下代码:
import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;
public class MainActivity extends Activity { private Button mCallButton;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mCallButton = (Button) findViewById(R.id.btn_call); mCallButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_CALL, Uri .parse("tel:10010")); startActivity(intent); } }); }
}
打开AndroidManifest.xml,添加拨打电话的权限,
uses-permission android:name="android.permission.CALL_PHONE"/
必须添加这条权限,否则无法拨打电话
6
连接手机,运行程序
无权限版(弹出拨号界面并自动输入电话号码,用户选择是否拨号):
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
public void Call(String Num,Context c){
if(Num !=null Num.length() 0){
Intent itt=new Intent(Intent.ACTION_DIAL,Uri.parse("tel:"+Num));
itt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
c.startActivity(itt);
}
}
权限版(弹出拨号界面,自动输入电话号码并立刻拨号,在部分系统中会触发安全警告):
!--- 权限 ---
uses-permission android:name="android.permission.CALL_PHONE" /
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
public void Call(String Num,Context c){
if(Num !=null Num.length() 0){
Intent itt=new Intent(Intent.ACTION_CALL,Uri.parse("tel:"+Num));
itt.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
c.startActivity(itt);
}
}
很简单的,自己给自己打电话是接不通的。
Intent phoneIntent = new Intent(
"android.intent.action.CALL", Uri.parse("tel:"
+ inputStr));
// 启动
startActivity(phoneIntent);
一、布局,拖一个框用来输入电话号码,一个按扭拨号
二、打电话的权限添加进来
uses-permission android:name="android.permission.CALL_PHONE"/
三、写拨号的点击事件
Activity:
public class DialerAction extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button button =(Button)findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener(){
publicvoid onClick(View v) {
EditTexteditText = (EditText)findViewById(R.id.mobile);
Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:"+ editText.getText()));
DialerAction.this.startActivity(intent);
}
});
}
}
四,输入另一个模拟器,例如5554 5556之类的号码就可以打电话了
在虚拟机同时开启两部Android,或者在旁边的电脑开启。一般电话号码就是Android左上角的5465.
1、 用反射调用 “com.android.internal.telephony.PhoneFactory”,“com.android.internal.telephony.CallManager”,“com.android.internal.telephony.Phone”中的方法。
代码如下:
public void Call(String number, Context context) {
try {
final Class? phoneFactoryClass = Class.forName("com.android.internal.telephony.PhoneFactory");
Method makeDefaultPhonesMethod = phoneFactoryClass.getDeclaredMethod("makeDefaultPhones", Context.class);
makeDefaultPhonesMethod.invoke(null, context);
Method getDefaultPhone = phoneFactoryClass.getDeclaredMethod("getDefaultPhone");
Object phone = getDefaultPhone.invoke(getDefaultPhone);
final Class? callManagerClass = Class.forName("com.android.internal.telephony.CallManager");
Method getInstanceMethod = callManagerClass.getDeclaredMethod("getInstance");
Object callManager = getInstanceMethod.invoke(getInstanceMethod);
final Class? phoneClass = Class.forName("com.android.internal.telephony.Phone");
Method registerPhoneMethod = callManagerClass.getDeclaredMethod("registerPhone", phoneClass);
registerPhoneMethod.invoke(callManager, phone);
Method maybeGetMethod = callManagerClass.getDeclaredMethod("getDefaultPhone");
Object phone1 = maybeGetMethod.invoke(callManager);
Method dial = phoneClass.getDeclaredMethod("dial", String.class);
dial.invoke(phone1, number);
} catch (ClassNotFoundException e) {
String string = e.getCause().toString();
Log.e("CallTest" ,string);
} catch (Exception e) {
String string = e.getCause().toString();
Log.e("CallTest" ,string);
}
}
2、在manifest中加如下权限
manifest xmlns:android=""
package="com.example.callphone"
android:sharedUserId="android.uid.system"
android:versionCode="1"
android:versionName="1.0"
uses-permission android:name= "andoird.permission.CALL_PHONE"/
uses-permission android:name= "andoird.permission.CALL_PRIVILEGED"/
uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/
uses-permission android:name="android.permission.CONNECTIVITY_INTERNAL"/
3、将生成的apk用系统签名,不同的OS有不同的签名,例如我用的是
java -jar signapk.jar platform.x509.pem platform.pk8 Callphone_unsigned.apk Callphone_signed.apk。其中platform.x509.pem platform.pk8在不同的OS中不同。
备注:用sharedUserId和系统签名后,程序才有权限运行。同理,程序不能调试,只能log跟踪。