【问题标题】:how to to take and show USSD response in a Textview如何在 Textview 中获取和显示 USSD 响应
【发布时间】:2015-09-14 00:41:30
【问题描述】:

我想使用 USSD 代码创建一个应用程序,但我不知道如何在 TextView 中获取和显示 USSD 响应。

我试过这个教程: Using IExtendedNetworkService to get USSD response in Android

我制作了该主题的所有课程,如下所示:

然后我创建了以下MainActivity

public class MainActivity extends ActionBarActivity {
    private EditText cartnumber_edittext,cartpass_edittext;
    private Button ussd_btn;
    private String cartnumber,cartpass;
    private TextView uss_response_txt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        cartnumber_edittext=(EditText) findViewById(R.id.cartnumber_edittext);
        cartpass_edittext=(EditText) findViewById(R.id.cartpass_edittext);
        ussd_btn=(Button) findViewById(R.id.ussd_btn);
        uss_response_txt=(TextView) findViewById(R.id.uss_response_txt);

        ussd_btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {

                cartnumber=cartnumber_edittext.getText().toString();
                cartpass=cartpass_edittext.getText().toString();

                USSDDumbExtendedNetworkService.mActive = false;

                String USSD_code = "tel:" + "*720*2*1*2*0*"+cartnumber+"*"+cartpass+"#";
                //Toast.makeText(getApplicationContext(), USSD_code, Toast.LENGTH_SHORT).show();
                Intent launchCall = new Intent(Intent.ACTION_CALL,
                        Uri.parse("tel:" + Uri.encode(USSD_code)));
                launchCall.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                launchCall.addFlags(Intent.FLAG_FROM_BACKGROUND);
                startActivity(launchCall);


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


            }
        });

    }

}

我不知道如何在TextView by String 中获取和显示 USSD 响应。 谁能帮帮我?

【问题讨论】:

    标签: android service textview response ussd


    【解决方案1】:

    试试看 在服务类中:

    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.codedemigod.ussdinterceptor.R;
    
    public class CDUSSDService extends Service{
    
            private String TAG = CDUSSDService.class.getSimpleName();
            private boolean mActive = false;  //we will only activate this "USSD listener" when we want it
    
            BroadcastReceiver receiver = new BroadcastReceiver() {
                @Override
                public void onReceive(Context context, Intent intent) {
                    if(intent.getAction().equals(Intent.ACTION_INSERT)){
                        //activity wishes to listen to USSD returns, so activate this
                        mActive = true;
                        Log.d(TAG, "activate ussd listener");
                    }
                    else if(intent.getAction().equals(Intent.ACTION_DELETE)){
                        mActive = false;
                        Log.d(TAG, "deactivate ussd listener");
                    }
                }
            };
    
            private final IExtendedNetworkService.Stub mBinder = new IExtendedNetworkService.Stub () {
                public void clearMmiString() throws RemoteException {
                    Log.d(TAG, "called clear");
                }
    
                public void setMmiString(String number) throws RemoteException {
                    Log.d (TAG, "setMmiString:" + number);
                }
    
                public CharSequence getMmiRunningText() throws RemoteException {
                    if(mActive == true){
                        return null;
                    }
    
                    return "USSD Running";
                }
    
                public CharSequence getUserMessage(CharSequence text)
                        throws RemoteException {
                    Log.d(TAG, "get user message " + text);
    
                    if(mActive == false){
                        //listener is still inactive, so return whatever we got
                        Log.d(TAG, "inactive " + text);
                        return text;
                    }
    
                    //listener is active, so broadcast data and suppress it from default behavior
    
                    //build data to send with intent for activity, format URI as per RFC 2396
                    Uri ussdDataUri = new Uri.Builder()
                    .scheme(getBaseContext().getString(R.string.uri_scheme))
                    .authority(getBaseContext().getString(R.string.uri_authority))
                    .path(getBaseContext().getString(R.string.uri_path))
                    .appendQueryParameter(getBaseContext().getString(R.string.uri_param_name), text.toString())
                    .build();
    
                    sendBroadcast(new Intent(Intent.ACTION_GET_CONTENT, ussdDataUri));
    
                    mActive = false;
                    return null;
                }
            };
    
            @Override
            public IBinder onBind(Intent intent) {
                Log.i(TAG, "called onbind");
    
                //the insert/delete intents will be fired by activity to activate/deactivate listener since service cannot be stopped
                IntentFilter filter = new IntentFilter();
                filter.addAction(Intent.ACTION_INSERT);
                filter.addAction(Intent.ACTION_DELETE);
                filter.addDataScheme(getBaseContext().getString(R.string.uri_scheme));
                filter.addDataAuthority(getBaseContext().getString(R.string.uri_authority), null);
                filter.addDataPath(getBaseContext().getString(R.string.uri_path), PatternMatcher.PATTERN_LITERAL);
                registerReceiver(receiver, filter);
    
                return mBinder;
            }   
    }
    

    在接收器类中(你想要的):

    import android.content.BroadcastReceiver;
    import android.content.Context;
    import android.content.Intent;
    import android.util.Log;
    
    public class CDBootCompleteRcv extends BroadcastReceiver {
        private String TAG = CDBootCompleteRcv.class.getSimpleName();
    
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.i(TAG, "rcvd boot event, launching service");
            Intent srvIntent = new Intent(context, CDUSSDService.class);
            context.startService(srvIntent);
        }
    
    }
    

    【讨论】:

    • 此来源来自this site and is tested
    • 那么主要活动呢? CDBootCompleteRcv 是我的主要活动?
    • CDUSSDService 是主要的
    • 完全可以从here下载
    • 我有电报@Milad_Ghazi
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 2012-11-04
    • 2021-01-26
    相关资源
    最近更新 更多