2017-02-27 22 views
0

我需要在應用程序中撥打電話。但我很困惑如何正確地爲Android和更高版本做到這一點。據我瞭解,我需要調用requestPermissions然後在onRequestPermissionsResult,結果工作。但我需要在這個函數之間存儲callNumber。在Android中添加請求權限的選項

我真的不知道,在活動保存電話號碼是個好主意,但我沒有其他的選擇。所以,我寫這篇文章的代碼:

public void callDriver(String phoneNumber) { 
    Intent callIntent = new Intent(Intent.ACTION_CALL); 
    callIntent.setData(Uri.parse(String.format("tel:+%s", phoneNumber))); 
    //FIXME: we need to save driver for calling in callback 
    phoneNumberForCall = phoneNumber; //potential problem 
    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) { 
     ActivityCompat.requestPermissions(this, 
              new String[]{Manifest.permission.CALL_PHONE}, 
              TaxiApp.MY_PERMISSIONS_REQUEST_CALL_PHONE); 
    } else { 
     startActivity(callIntent); 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, 
             String permissions[], int[] grantResults) { 
    switch (requestCode) { 
     case TaxiApp.MY_PERMISSIONS_REQUEST_CALL_PHONE: { 
      // If request is cancelled, the result arrays are empty. 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

       Intent callIntent = new Intent(Intent.ACTION_CALL); 
       callIntent.setData(Uri.parse(String.format("tel:+%s", phoneNumberForCall))); 
       startActivity(callIntent); 

      } else { 

       Toast.makeText(this, getString(R.string.no_call_permission), Toast.LENGTH_LONG).show(); 
      } 
      return; 
     } 

     // other 'case' lines to check for other 
     // permissions this app might request 
    } 
} 

如果我們節省手機的活動,同時異步請求被處理&我的理解,它不會做它可以改變,但它可能是一個問題。

我應該如何使這是否正確?

P.S. 我們呼叫的號碼可能會改變。除此之外,還有一個包含數字的列表(recycleView)。用戶可以點擊每個號碼和功能callDriver將被調用。

恐怕這種情況:

  1. 用戶點擊數 - >功能callDriver執行
  2. callDriver請求的權限。存儲第一個號碼。
  3. 上的另一個電話號碼,用戶點擊 - >功能callDriver執行請求的權限和存儲的號碼發生變化。存儲第二個號碼。
  4. 已授予權限。回撥已執行,我們呼叫第二個號碼。

這就是爲什麼我們不會打電話的車手。我認爲這種情況不會發生。 (用戶應該點擊得太快。)但是最好知道如何正確地做到這一點。

+0

您可以使用sharedpreferences用於此目的。看看https://developer.android.com/training/basics/data-storage/shared-preferences。html –

+0

如果聯繫電話號碼總是相同的,你可以在這裏寫,但是如果它會改變或者可能有不同的號碼存儲在共享偏好設置中並從那裏使用它。 –

+0

同意@ Mr.Rabbit使用sharedpreferences,你可以在你的應用程序的任何地方使用它。 –

回答

0

的列表,您可以使用SharedPreferences保存的電話號碼。下面的代碼:

保存的電話號碼:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mContext); 
SharedPreferences.Editor ed = prefs.edit(); 
ed.putString(KEY_PHONE_NUMBER_FOR_CALL, phoneNumber); 
// ed.commit() can also be used but it is synchronous while ed.apply() is asynchronous. 
ed.apply(); 

檢索:

String phoneNumberForCall = prefs.getString(KEY_PHONE_NUMBER_FOR_CALL, defaultValue); 

文檔:https://developer.android.com/training/basics/data-storage/shared-preferences.html

+0

將它保存到sharedpreferences或保存在這裏看起來一樣。我根本不想存儲號碼。只是以某種方式將它從權限請求轉移到權限回調。但謝謝你的答案。 –

0

另一種方法是什麼號碼,你會打電話,如果將保存到您的通話記錄,你可以得到的數據形式存在。使用光標

Cursor managedCursor = managedQuery(CallLog.Calls.CONTENT_URI, null, null, null, null); 
int number = managedCursor.getColumnIndex(CallLog.Calls.NUMBER); 
int type = managedCursor.getColumnIndex(CallLog.Calls.TYPE); 

while (managedCursor.moveToNext()) { 

String phNumber = managedCursor.getString(number); 
String callType = managedCursor.getString(type); 

int dircode = Integer.parseInt(callType); 

switch (dircode) { 

case CallLog.Calls.OUTGOING_TYPE: 
//write your code here 
break; 

} 

} 

然後關閉遊標OBJ,您將獲得的手機號碼

+0

謝謝。這是非常有趣和有用的方法。我對遊標不太瞭解。但現在我知道該讀什麼。 –