2013-01-09 38 views
4

我知道這很簡單,但我遇到了一個非常奇怪的問題。我只需點擊一個按鈕就可以給危險的情況打電話。所以我用下面的代碼來調用。如何在Android中直接撥打電話

Intent callIntent = new Intent(Intent.ACTION_CALL); 
      callIntent.setData(Uri.parse("tel:100")); 
      callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      ctx.startActivity(callIntent); 

AndroidManifest.xml中增加了CALL_PHONE權限。問題在於它在撥號盤上打開了100,但沒有直接撥打電話。我希望當用戶點擊按鈕時立即發生。

當我試圖把+91之前的+91自動呼叫號碼,但爲什麼加號是這樣的數字所必需的。所以有人幫我如何解決這個問題

+0

我懷疑它可能與'100'不是美國電話系統上的有效電話號碼有關。 (這可能是一個bug) – geoffspear

回答

4

ACTION_CALL文檔:

注:上會有哪些應用程序可以發起呼叫限制;大多數應用程序應該使用ACTION_DIAL。

注意:此意圖不能用於撥打緊急電話號碼。但是,應用程序可以使用ACTION_DIAL撥打緊急號碼。

所以看起來這種行爲是故意的。

+1

具體而言,您需要'CALL_PRIVILEGED'權限,這對普通SDK應用程序不可用。 – CommonsWare

0

有可能是一個問題,安卓系統不會識別100作爲一個有效的電話號碼,而不是如果你把國家代碼之前,它可以正常工作。爲了解決這個問題,請看這個庫libnhonenumber。你可以使用它像這樣

public static ArrayList<String> extractPhoneNumber(String content) { 

    ArrayList<String> numbers = new ArrayList<String>(0); 

    PhoneNumberUtil instance = PhoneNumberUtil.getInstance(); 

    //Change IT with your contry code 
    Iterable<PhoneNumberMatch> matches = instance.findNumbers(content, "IT"); 

    Iterator<PhoneNumberMatch> iterator = matches.iterator(); 

    while (iterator.hasNext()) { 
     numbers.add(instance.format(iterator.next().number(), PhoneNumberFormat.INTERNATIONAL)); 
    } 

    return numbers; 
} 
0
private void phoneCall() 
{ 
String phoneCallUri = "tel:91"; 
Intent phoneCallIntent = new Intent(Intent.ACTION_CALL); 
phoneCallIntent.setData(Uri.parse(phoneCallUri)); 
startActivity(phoneCallIntent); 
} 
0

無需用戶干預直接調用最好的辦法..

String uri = "tel:" + num.trim(); 
Intent intent = new Intent(Intent.ACTION_CALL); 
intent.setData(Uri.parse(uri)); 
startActivity(intent); 
0

有兩個意圖調用/開始打電話:ACTION_CALL和ACTION_DIAL。 ACTION_DIAL只會打開撥號程序,號碼填寫完整,但允許用戶實際撥打或拒絕來電。 ACTION_CALL會立即撥打該號碼並需要額外的權限。 因此,請確保您有權限

+0

您是否首先收到我的問題@ user69226。我知道ACTION_CALL會直接撥打手機號碼,但不會撥打100等緊急號碼。 – TNR

0

長時間過去了。但可能會幫助別人。 如果你想直接打電話,你應該使用requestPermissions方法。

此行添加到您的清單文件:

<uses-permission android:name="android.permission.CALL_PHONE" /> 

2.定義在活動類的類變量:

private static Intent phoneCallIntent; //If use don't need a member variable is good to use a static variable for memory performance. 

添加這些行到onCreate活動方法:

final String permissionToCall = Manifest.permission.CALL_PHONE; 
//Assume that you have a phone icon. 
(findViewById(R.id.menuBarPhone)).setOnClickListener(new OnClickListener(){ 
    public void onClick(View view) { 
     phoneCallIntent = new Intent(Intent.ACTION_CALL); 
     phoneCallIntent.setData(Uri.parse(getString(R.string.callNumber))); //Uri.parse("tel:your number") 
     if (ActivityCompat.checkSelfPermission(MainFrame.this, permissionToCall) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainFrame.this, new String[]{permissionToCall}, 1); 
      return; 
     } 
     startActivity(phoneCallIntent); 
    } 
}); 

4。而對於點擊之後打電話立即允許按鈕,覆蓋onRequestPermissionsResult方法:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults){ 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    if(requestCode == 1){ 
     final int permissionsLength = permissions.length; 
     for (int i = 0; i < permissionsLength; i++) { 
      if(grantResults[i] == PackageManager.PERMISSION_GRANTED){ 
       startActivity(phoneCallIntent); 
      } 
     } 
    } 

當用戶賦予的權限,下一次就不會有對話框和呼叫將被直接作出。