2016-11-07 7 views
1

私はandroid.telecom.ConnectionServiceを使用しています。なぜなら私はvoid getCallerDisplayName()を含む接続クラスを取得したいのですが、私のサービスはConnectionServiceを拡張します。そしてTelecomManager私はCNAP(CallerDisplayName)をAndroidで入手するのに手助けが必要です

TelecomManager telecomManager = (TelecomManager) getSystemService(Context.TELECOM_SERVICE); 

    ComponentName componentName = new ComponentName("com.ukrainelike.rate", "com.ukrainelike.rate.myservice"); 
    PhoneAccountHandle phoneAccountHandle = new PhoneAccountHandle(componentName, "Admin"); 
    PhoneAccount.Builder builder = new PhoneAccount.Builder(phoneAccountHandle, "Admin"); 
    builder.setCapabilities(PhoneAccount.CAPABILITY_CALL_PROVIDER); 
    PhoneAccount phoneAccount = builder.build(); 
    telecomManager.registerPhoneAccount(phoneAccount); 

を私のサービスを登録し、例外を取得:

`<service 
     android:name=".MyService" 
     android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"> 
     <intent-filter> 
      <action android:name="android.telecom.ConnectionService" /> 
     </intent-filter> 
    </service>` 

<uses-permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"/>java.lang.SecurityException: PhoneAccount connection service requires BIND_TELECOM_CONNECTION_SERVICE permission.が、私はマニフェストファイルで、この書き込み許可を助けてください。

答えて

1

あなたのComponentNameが失敗していると思います。

ComponentName cName = new ComponentName(mContext.getPackageName(), MyConnectionService.class.getName()); 
mPhoneAccountHandle = new PhoneAccountHandle(cName, "whatever you want"); 

さらに、

<uses-permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"/> は必要ありません:それは次のようなものでなければなりません。

あなたはによって作成されていない接続の発信者名を取得しようとしている場合は、あなたのConnectionService、あなたのサービスからSecurityException

0

削除の権限を取得します。

<service 
    android:name=".MyService"> 
    <intent-filter> 
     <action android:name="android.telecom.ConnectionService" /> 
    </intent-filter> 
</service> 

プラットフォームのコード

/** 
* Determines if the connection service specified by a {@link PhoneAccountHandle} requires the 
* {@link Manifest.permission#BIND_TELECOM_CONNECTION_SERVICE} permission. 
* 
* @param phoneAccountHandle The phone account to check. 
* @return {@code True} if the phone account has permission. 
*/ 
public boolean phoneAccountRequiresBindPermission(PhoneAccountHandle phoneAccountHandle) { 
    List<ResolveInfo> resolveInfos = resolveComponent(phoneAccountHandle); 
    if (resolveInfos.isEmpty()) { 
     Log.w(this, "phoneAccount %s not found", phoneAccountHandle.getComponentName()); 
     return false; 
    } 
    for (ResolveInfo resolveInfo : resolveInfos) { 
     ServiceInfo serviceInfo = resolveInfo.serviceInfo; 
     if (serviceInfo == null) { 
      return false; 
     } 

     if (!Manifest.permission.BIND_CONNECTION_SERVICE.equals(serviceInfo.permission) && 
       !Manifest.permission.BIND_TELECOM_CONNECTION_SERVICE.equals(
         serviceInfo.permission)) { 
      // The ConnectionService must require either the deprecated BIND_CONNECTION_SERVICE, 
      // or the public BIND_TELECOM_CONNECTION_SERVICE permissions, both of which are 
      // system/signature only. 
      return false; 
     } 
    } 
    return true; 
} 

しかし、あなたはTelephonyConnectionまたはSipConnectionからCallerDisplayNameを取得したい場合、あなたはプラットフォームの開発者は、これらの発信者情報にアクセスすることができないサードパーティ製のアプリケーションでなければなりません。

関連する問題