2014-07-04 22 views
5

Gelen çağrıyı kapatmak istiyorum ve sonra onu asmak istiyorum.Android uygulamasına com.android.internal.telephony.ITelephony nasıl aktarılır

Sorun şu ki: com.android.internal.telephony.ITelephony çözümlenmiyor.

benim uygulamaya paketi com.android.internal.telephony ekleyerek çalıştı ve arayüz oluşturmak:

package com.android.internal.telephony; 

public interface ITelephony {  

    boolean endCall();  

    void answerRingingCall();  

    void silenceRinger(); 

} 

ancak arama sona edilmez. İşte çağrıyı, ekran tost (görüntülendiğinde) tespit

sonra asmak deneyin ama önce söylediğim gibi ben o paketi yaratmadan önce hiçbir com.android.internal.telephony.ITelephony vardı:

private class CallStateListener extends PhoneStateListener { 
     @Override 
     public void onCallStateChanged(int state, String incomingNumber) { 
      switch (state) { 
      case TelephonyManager.CALL_STATE_RINGING: 
       // called when someone is ringing to this phone 
       Toast.makeText(ctx, "Incoming: " + incomingNumber, Toast.LENGTH_LONG).show(); 
       try{ 
         TelephonyManager tm = (TelephonyManager) ctx.getSystemService(Context.TELEPHONY_SERVICE); 
         Class c = Class.forName(tm.getClass().getName()); 
         Method m = c.getDeclaredMethod("getITelephony"); 
         com.android.internal.telephony.ITelephony telephonyService = (com.android.internal.telephony.ITelephony) m.invoke(tm); 

         telephonyService = (com.android.internal.telephony.ITelephony) m.invoke(tm); 
         telephonyService.silenceRinger(); 
         telephonyService.endCall(); 
        }catch (Exception e) { 
         e.printStackTrace(); 

        } 
       break; 
      } 
     } 
    } 

Benim Manifest ve izinler:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.a" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="17" 
     android:targetSdkVersion="17" /> 
    <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 
    <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> 
    <uses-permission android:name="android.permission.CALL_PHONE" /> 
    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name=".MainActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service 
      android:name=".CallDetectService" 
      android:enabled="true" 
      android:exported="false" > 
     </service> 
    </application> 



</manifest> 

cevap

14

ITelephony arabirimi dahili, dolayısıyla standart bir başvuru alamıyorsunuz. Sen olabilir kullanım yansıma tüm yol, yani

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 

Method m1 = tm.getClass().getDeclaredMethod("getITelephony"); 
m1.setAccessible(true); 
Object iTelephony = m1.invoke(tm); 

Method m2 = iTelephony.getClass().getDeclaredMethod("silenceRinger"); 
Method m3 = iTelephony.getClass().getDeclaredMethod("endCall"); 

m2.invoke(iTelephony); 
m3.invoke(iTelephony); 

Ama o yöntemleri yalnızca sistem uygulamaları için verilebilir MODIFY_PHONE_STATE iznine ihtiyaç her iki şekilde. Yani korkarım zaten işe yaramayacak.

+0

Android Play Store'da standart Dialer'a (telefon uygulaması) alternatif var, belki de etrafta dolaşmanın bir yolu var. – Yoda

+0

Oh lütfen bu EDIT 3'e bakın: http://stackoverflow.com/questions/24580223/how-to-reject-any-incoming-call-when-i-have-already-detected-it/24580252?noredirect=1 # comment38077652_24580252 'ITelephony' arayüzünü grep kodundan kopyaladığım soru şu: http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/com /android/internal/telephony/ITelephony.java/?v=source). com.android.internal.telephone' paketine. – Yoda

+0

Sadece yan tarafta. Neden dahili? Dahili sadece özel mi yoksa korumalı mı? Eğer erişimi devre dışı bırakmak için, o zaman yansıma işi yaparsa gerçekten işe yaramıyor, o zaman neden bitti? – Yoda