2017-02-27 1 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. 전화 번호는 변경 될 수 있습니다. 그 이상의 숫자가있는 목록 (recycleView)이 있습니다. 사용자는 각 번호와 기능을 클릭 할 수 있습니다. callDriver이 호출됩니다.

내가이 상황을 두려워 : 수에

  1. 사용자 클릭 -> 기능 callDriver
  2. callDriver 요청 권한을 실행합니다. 첫 번째 숫자가 저장되었습니다.
  3. 사용자가 다른 전화 번호를 클릭 -> function callDriver은 요청 권한을 실행하고 저장된 번호가 변경되었습니다. 두 번째 숫자가 저장됩니다.
  4. 허가가 승인되었습니다. 콜백이 실행되고 두 번째 숫자가 호출됩니다.

그래서 우리는 첫 번째 드라이버를 호출하지 않습니다. 나는이 상황이 계속 일어날 수 있다고 생각하지 않는다. (사용자가 너무 빨리 클릭해야합니다.) 그러나 올바르게 수행하는 방법을 알고있는 것이 좋습니다.

+0

당신은이 목적을 위해 된 SharedPreferences를 사용할 수 있습니다. https://developer.android.com/training/basics/data-storage/shared-preferences를 확인하십시오.htaccess Admin Home English Language Content –

+0

연락처 번호가 항상 동일하면 여기에 쓸 수 있지만 변경되거나 여러 가지 번호가있을 수있는 경우 공유 환경 설정에 저장하고 거기에서 사용할 수 있습니다. –

+0

@ Mr.Rabbit와 동의 sharepreferences를 사용하면 앱에서 어디에서나 사용할 수 있습니다. –

답변

0

의 목록을 얻을 것이다.

전화 번호를 저장 : 다음은 코드의

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를 닫고 당신은 당신이 전화 번호를 저장할 된 SharedPreferences를 사용할 수있는 휴대 전화 번호

+0

감사합니다. 이것은 정말 재미 있고 유용한 방법입니다. 나는 커서에 대해 많이 모른다. 그러나 이제 나는 무엇에 대해 읽을 지 안다. –