Android实现电话跳转界面拨号与直接发送短信
一、电话拨号
下面的是我们的最终的效果图:
首先我们先来贴一下layout
的布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_marginTop="100dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请输入要拨打的电话号码"
android:textSize="20dp"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_num"
android:inputType="number"
android:textSize="32sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="拨打"
android:textSize="32sp"
android:id="@+id/dial"/>
</LinearLayout>
上面的布局中我们用了三个简单的控件,用TextView
书写说明文字,使用EditText
来输入要拨打的号码,其中我们使用了inputType
来说明输入的内容类型,此处我们只规定为数字类型,用Button
来承载点击事件。
接着我们需要在与layout对应的Activity中编写实现的最终代码MainActivity
:
public class Main1Activity extends AppCompatActivity {
private EditText ed_num;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ed_num = (EditText) findViewById(R.id.ed_num);
Button dial = (Button) findViewById(R.id.dial);
dial.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String num = ed_num.getText().toString().trim();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DIAL);
intent.setData(Uri.parse("tel://"+num));
startActivity(intent);
}
});
}
上面便是完整的Activity代码,控件的对应就不用说了,我们看一下button的点击事件,使用字符串类型num
获得用户输入的电话号码,然后定义了一个Intent,设置它的活动为Intent.ACTION_DIAL
,数据为解析过得字符串"tel://"+num
(java中可以用“+”来连接字符串),解析成URI的类型,最后发送活动即可。到此,拨好功能便实现了。
这里我们并没有去申请权限,因为我们没有跳过用户的恳求直接去拨打号码,而是在拨打之前是需要用户在点击一次拨打按钮的,所以不需要申请权限。
目前,我们经常会看到一种自动跳转界面拨号功能,例如QQ里的识别电话号码的一串数字,然后你点击后会询问你的接下来的操作,如果点解拨打,这时便会跳转到拨号界面,并且复制了所需的电话号码,这一功能便可以如上实现。
二、发送短信
上面的图片中展示了从虚拟机5554向5556发送短信的过程。这里我们是直接向指定号码发送短信,没有去跳转界面,所有需要向用户申请发送短信的权限,在用户同意之后才发送短信。
首先,还是提出layout的源代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Main3Activity"
android:orientation="vertical">
<TextView
android:layout_marginTop="100dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请输入要发送的电话号码"
android:textSize="32sp"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/et_num"
android:inputType="number"
android:textSize="32sp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="请输入要发送的短信信息"
android:textSize="32sp"/>
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/ed_content"
android:inputType="textMultiLine"
android:textSize="32sp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="发送"
android:textSize="32sp"
android:id="@+id/sent"/>
</LinearLayout>
这里依然简略讲解一下上述代码。有两个EditText
,第一个id为ed_content
,用来输入对方的手机号码,类型规定为数字,第二个id为ed_content
,用来输入内容。接下来有一个button,用来实现点击事件。
接下来是java源代码
public class MainActivity extends AppCompatActivity {
private EditText et_content;
private EditText et_num;
private Button sent;
static int RequestCode = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_content = (EditText) findViewById(R.id.et_content);
et_num = (EditText) findViewById(R.id.et_num);
sent = (Button) findViewById(R.id.sent);
sent.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onClick(View v) {
sent(v);
}
});
}
//这里需要判断App是否有权限发送短信,如果没有,则需要用户同意权限。
//因为Android7或之后都需要向如下一样申请权限,你会发现在Android7之前直接调用`send()方法都行`
@RequiresApi(api = Build.VERSION_CODES.M)
public void sent(View view){
if(!(ActivityCompat.checkSelfPermission(this,Manifest.permission.SEND_SMS)== PackageManager.PERMISSION_GRANTED)){
requestPermissions(new String[]{Manifest.permission.SEND_SMS},RequestCode);
}else {
send();
}
}
//回调函数,用来判断在用户同意权限之后需要条用的方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == RequestCode){
send();
}
}
//抽取方法,提高代码利用率
private void send() {
String contenter = et_content.getText().toString();
String num = et_num.getText().toString().trim();
if (num.equals("")){
Toast.makeText(Main3Activity.this,"请输入手机号码!",Toast.LENGTH_SHORT).show();
}else {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(num,null,contenter,null,null);
}
}
}
发送短信需要在manifest文件夹下的AndroidManifest.xml
中设置权限,在manifest标签下加入如下语句:
<uses-permission android:name="android.permission.SEND_SMS" />
这里就不详细讲解代码的内容了,源代码中都有注释来简要说明。
至此,发送短信的功能便实现了。