1. 程式人生 > >Android撥打電話等功能實現及其延伸

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);

以上,就是今天總結的,後續遇到會繼續補充,歡迎指正!