2017-02-27 67 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

谢谢。这是非常有趣和有用的方法。我对游标不太了解。但现在我知道该读什么。 –