1. 程式人生 > >安卓實現電話撥號與資訊的直接傳送

安卓實現電話撥號與資訊的直接傳送

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" />

這裡就不詳細講解程式碼的內容了,原始碼中都有註釋來簡要說明。 至此,傳送簡訊的功能便實現了。