前言
项目中经常用到点击一个button,直接拨打电话的功能。今天就由此功能系统的记录一下相关知识点。
一、拨打电话功能
有两种方法:
第一种如下:
Intent intent = new Intent(Intent.ACTION_CALL);
Uri data = Uri.parse("tel:13800000000");
intent.setData(data);
startActivity(intent);
这种方法会直接拨打电话,这种方法的前提是需要在AndroidManifest.xml文件中添加拨打电话的权限
<uses-permission android:name="android.permission.CALL_PHONE"/>
如果应用是这种方式启动打电话功能,如果用户关闭了app的拨打电话权限。当执行此方法的时候,会异常退出!
第二种方法如下:
Intent intent = new Intent(Intent.ACTION_DIAL);
Uri data = Uri.parse("tel:13800000000");
startActivity(intent);
这种方式会调起拨打电话界面,最终是否拨打是由用户做决定。
这种方式不需要赋予app相应的 权限。
二、其他相关功能
1、使用Intent打开网页
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse("http://www.baidu.com");
startActivity(intent);
2、使用Intent播放视频
String filePath = Environment.getExternalStorageDirectory().getPath()+"/video.mp4"
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri data = Uri.parse(filePath);
intent.setDataAndType(uri, "video/mp4");
startActivity(intent);
3、使用Intent调用系统相册
Intent intent1 = new Intent(Intent.ACTION_PICK);
intent1.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
startActivityForResult(intent1, REQUEST_CODE);
这样会调起系统的相册,如果想得到选取的照片,需要在调起相册的Activity中重新onActivityResult,并添加读取文件的权限,本文暂时不讨论这些。
4、使用Intent调起照相功能
Intent intent = new Intent();
// 指定开启系统相机的Action
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, 1);
此方式只能调起系统的相机并拍照,但是并不会保存到手机上,而且调起拍照功能的Activity更得不到照片。
如果想拍照并得到照片。代码如下:
Intent intent = new Intent();
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
String out_file_path = Environment.getExternalStorageDirectory().getPath()+"img";
File dir = new File(out_file_path);
if (!dir.exists()) {
dir.mkdirs();
}
Uri uri = Uri.fromFile(new File(cameraPath));
// 设置系统相机拍摄照片完成后图片文件的存放地址
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
startActivityForResult(intent, REQUEST_CODE);
然后再在调用拍照功能的Activity中重写onActivityresult方法。
以上是一些相关的功能的大致的实现,欢迎指正
三、隐式启动Activity
以上都属于隐式启动activity
下面讲一下更通用的隐式启动activity的相关知识。
隐式启动不能直观的看出启动的是哪个Activity,而是通过action和category去指定要启动的Activity。
Activity在AndroidManifest.xml文件注册的时候,添加标签<intent-filter>
,在此标签中就可以添加<action>
和`<category>
标签了,也就能只表明当前Activity可以响应哪些启动规则,示例:
<activity android:name=".ActivityA">
<intent-filter>
<action android:name="xxx"/>
<category android:name="tt"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
注意,如果使用隐式注册activity的时候,<category android:name="android.intent.category.DEFAULT"/>
这句是必须要加上的,否则会找不到这个activity
而启动此activity的方法如下:
Intent intent = new Intent();
intent.setAction("xxx");
intent.addCategory("tt");
startActivity(intent);
以上,就是今天总结的,后续遇到会继续补充,欢迎指正!