Android撥打電話等功能實現及其延伸
前言
專案中經常用到點選一個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);
以上,就是今天總結的,後續遇到會繼續補充,歡迎指正!