2013-01-03 21 views
7

Sto cercando di trovare il modo di effettuare richieste USSD in Android. Ho trovato questo - http://commandus.com/blog/?p=58. Ho aggiunto tutti i file necessari al mio progetto.Utilizzo di IExtendedNetworkService per ottenere risposta USSD in Android

USSDDumbExtendedNetworkService.java:

package com.android.ussdcodes; 

import android.app.Service; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.net.Uri; 
import android.os.IBinder; 
import android.os.PatternMatcher; 
import android.os.RemoteException; 
import android.util.Log; 

import com.android.internal.telephony.IExtendedNetworkService; 
import com.android.ussdcodes.R; 

/** 
* Service implements IExtendedNetworkService interface. 
* USSDDumbExtendedNetworkService 
* Service must have name "com.android.ussd.IExtendedNetworkService" of the intent declared 
* in the Android manifest file so com.android.phone.PhoneUtils class bind 
* to this service after system rebooted. 
* Please note service is loaded after system reboot! 
* Your application must check is system rebooted. 
* @see Util#syslogHasLine(String, String, String, boolean) 
*/ 
public class USSDDumbExtendedNetworkService extends Service { 
    public static final String TAG = "CommandusUSSDExtNetSvc"; 
    public static final String LOG_STAMP = "*USSDTestExtendedNetworkService bind successfully*"; 
    public static final String URI_SCHEME = "ussdcodes"; 
    public static final String URI_AUTHORITY = "android.com"; 
    public static final String URI_PATH = "/"; 
    public static final String URI_PAR = "return"; 
    public static final String URI_PARON = "on"; 
    public static final String URI_PAROFF = "off"; 
    public static final String MAGIC_ON = ":ON;)"; 
    public static final String MAGIC_OFF = ":OFF;("; 
    public static final String MAGIC_RETVAL = ":RETVAL;("; 

    private static boolean mActive = false; 
    private static CharSequence mRetVal = null; 
    private Context mContext = null; 
    private String msgUssdRunning = "USSD running..."; 

    final BroadcastReceiver mReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (Intent.ACTION_INSERT.equals(intent.getAction())) { 
       mContext = context; 
       if (mContext != null) { 
        msgUssdRunning = mContext.getString(R.string.USSD_run); 
        mActive = true; 
        Log.d(TAG, "activate"); 
       } 
      } else if (Intent.ACTION_DELETE.equals(intent.getAction())) { 
       mContext = null; 
       mActive = false; 
       Log.d(TAG, "deactivate"); 
      } 
     } 
    }; 

    private final IExtendedNetworkService.Stub mBinder = new IExtendedNetworkService.Stub() { 
     @Override 
     public void setMmiString(String number) throws RemoteException { 
      Log.d(TAG, "setMmiString: " + number); 
     } 

     @Override 
     public CharSequence getMmiRunningText() throws RemoteException { 
      Log.d(TAG, "getMmiRunningText: " + msgUssdRunning); 
      return msgUssdRunning; 
     } 

     @Override 
     public CharSequence getUserMessage(CharSequence text) 
       throws RemoteException { 
      if (MAGIC_ON.contentEquals(text)) { 
       mActive = true; 
       Log.d(TAG, "control: ON"); 
       return text; 
      } else { 
       if (MAGIC_OFF.contentEquals(text)) { 
        mActive = false; 
        Log.d(TAG, "control: OFF"); 
        return text; 
       } else { 
        if (MAGIC_RETVAL.contentEquals(text)) { 
         mActive = false; 
         Log.d(TAG, "control: return"); 
         return mRetVal; 
        } 
       } 
      } 

      if (!mActive) { 
       Log.d(TAG, "getUserMessage deactivated: " + text); 
       return text; 
      } 
      String s = text.toString(); 
      // store s to the ! 
      Uri uri = new Uri.Builder() 
       .scheme(URI_SCHEME) 
       .authority(URI_AUTHORITY) 
       .path(URI_PATH) 
       .appendQueryParameter(URI_PAR, text.toString()) 
       .build(); 
      sendBroadcast(new Intent(Intent.ACTION_GET_CONTENT, uri)); 
      mActive = false; 
      mRetVal = text; 
      Log.d(TAG, "getUserMessage: " + text + "=" + s); 
      return null; 
     } 

     @Override 
     public void clearMmiString() throws RemoteException { 
      Log.d(TAG, "clearMmiString"); 
     } 
    }; 


    /** 
    * Put stamp to the system log when PhoneUtils bind to the service 
    * after Android has rebooted. Application must call {@link Util#syslogHasLine(String, String, String, boolean)} to 
    * check is phone rebooted or no. Without reboot phone application does not bind tom this service! 
    */ 
    @Override 
    public IBinder onBind(Intent intent) { 
     // Do not localize! 
     Log.i(TAG, LOG_STAMP); 
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(Intent.ACTION_INSERT); 
     filter.addAction(Intent.ACTION_DELETE); 
     filter.addDataScheme(URI_SCHEME); 
     filter.addDataAuthority(URI_AUTHORITY, null); 
     filter.addDataPath(URI_PATH, PatternMatcher.PATTERN_LITERAL); 
     registerReceiver(mReceiver, filter); 

     return mBinder; 
    } 

    public IBinder asBinder() { 
     Log.d(TAG, "asBinder"); 
     return mBinder; 
    } 

} 

manifesto:

<receiver android:name="com.android.ussdcodes.BootReceiver"> 
      <intent-filter> 
       <action android:name="android.intent.action.BOOT_COMPLETED" /> 
      </intent-filter> 
     </receiver> 

     <service 
      android:name=".USSDDumbExtendedNetworkService" > 
      <intent-filter android:icon="@drawable/ic_launcher"> 
       <action android:name="com.android.ussd.IExtendedNetworkService" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
      </intent-filter> 
     </service> 

BootReceiver.java:

package com.android.ussdcodes; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 

public class BootReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     // TODO Auto-generated method stub 
     Log.d("USSDService", context.getString(R.string.service_started)); 
     context.startService(new Intent(context,USSDDumbExtendedNetworkService.class)); 
    } 

} 

Così ora il servizio viene avviato dopo l'avvio completo.

E la mia domanda è come devo inviare la richiesta USSD e ottenere risposta con il servizio? Grazie!)

+0

Riesci a trovare il modo di fare che sto cercando stessa cosa :( – Majid

+0

Ho aggiornato la risposta –

+0

'com.android.internal.telephony.IExtendedNetworkService;' impossibile essere risolto. Puoi dirmi qual è la tua versione sdk minima? – IronBlossom

risposta

2

Bene, ho trovato la risposta.

Ho appena inserito il link on my gist.

messaggi Disattiva

USSDDumbExtendedNetworkService.mActive = false; 

Invia USSD:?

Intent launchCall = new Intent(Intent.ACTION_CALL, 
         Uri.parse("tel:" + Uri.encode(ussdcode))); 
launchCall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
launchCall.addFlags(Intent.FLAG_FROM_BACKGROUND); 
startActivity(launchCall); 

attivare i messaggi di nuovo

USSDDumbExtendedNetworkService.mActive = true; 
USSDDumbExtendedNetworkService.mRetVal = null; 
+0

Quale versione di Android è stata testata? – gkiko

+0

Ho faticato per far funzionare questo esempio, ma senza alcun risultato. Poi ho trovato [questo] (https://code.google.com/p/android/issues/detail?id=57120#c14) – gkiko

+0

L'ho provato su 4.1.1 – gkiko