2014-07-04 5 views
5

Ich möchte eingehenden Anruf auflegen Ich erkenne es und dann möchte ich auflegen.So importieren Sie com.android.internal.telephony.ITelephony in die Android-Anwendung

Das Problem ist, dass dies: com.android.internal.telephony.ITelephony ist nicht gelöst.

habe ich versucht Paket com.android.internal.telephony zu meiner Anwendung hinzufügen und erstellen Schnittstelle:

package com.android.internal.telephony; 

public interface ITelephony {  

    boolean endCall();  

    void answerRingingCall();  

    void silenceRinger(); 

} 

aber der Anruf nicht beendet wird.

Hier habe ich erkennen Anruf, Anzeige Toast (es angezeigt wird), dann versuchen bis zu hängen, aber als ich die erste war kein com.android.internal.telephony.ITelephony, bevor ich das Paket erstellt:

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; 
      } 
     } 
    } 

Mein Manifest und Berechtigungen:

<?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> 

Antwort

14

Die Schnittstelle ITelephony ist intern, Sie können also keine Standardreferenz darauf erhalten. Sie konnte Reflektion verwenden den ganzen Weg, das heißt

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); 

Aber so oder so diese Methoden benötigen die MODIFY_PHONE_STATE Erlaubnis, die sich nur auf System-Anwendungen erteilt werden kann. Also ich fürchte, es wird sowieso nicht funktionieren.

+0

Es gibt Alternative zu Standard-Dialer (Telefon-Anwendung) im Android Play Store, vielleicht gibt es einen Weg, um es zu umgehen. – Yoda

+0

Oh bitte sehen Sie diese EDIT 3 hier: http://stackoverflow.com/questions/24580223/how-to-reject-any-incoming-call-when-i-have-ready-detected-it/24580252?noredirect=1 # comment38077652_24580252 Es ist meine Frage, wo ich gerade 'ITelephony' Schnittstelle vom grep Code kopierte (http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/2.1_r2/com /android/internal/telephony/ITelefony.java/?v=source) zum 'com.android.internal.telephone' Paket. – Yoda

+0

Nur auf der Seite. Warum ist es intern? Bedeutet intern nur privat oder geschützt? Wenn man den Zugriff darauf deaktiviert, dann funktioniert es nicht wirklich, wenn Reflektion den Job erledigt, warum also? – Yoda

Verwandte Themen