3

我使用 AIDL 接口 IExtendedNetworkService 来获取 USSD 代码。但应用程序只有在重启设备后才能工作。我在安装应用程序后尝试了 bindservice,但它没有用。所以我的问题是如何在不重启设备的情况下绑定服务。这是我的代码: 界面:

package com.android.internal.telephony;

    interface IExtendedNetworkService {

        void setMmiString(String number);

        CharSequence getMmiRunningText();

        CharSequence getUserMessage(CharSequence text);

        void clearMmiString();
    }

服务

public class CDUSSDService extends Service {

    private String TAG = "THANG-NGUYEN";
    private boolean mActive = false; 

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

    public void onCreate() {
        Log.i(TAG, "called onCreate");
    };

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i(TAG, "called onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

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

主要活动:

public class MainActivity extends Activity {

    private Button btnCheckUSSD;
    private Context mContext;
    private IExtendedNetworkService mService;
    private EditText inputUSSD;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.activity_main);
        btnCheckUSSD = (Button) findViewById(R.id.btn_check);
        inputUSSD = (EditText) findViewById(R.id.input_ussd);

        btnCheckUSSD.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
                if (!inputUSSD.getText().toString().isEmpty()) {

                    Intent service = new Intent(
                            "com.android.ussd.IExtendedNetworkService");
                    bindService(service, mConnecton, Context.BIND_AUTO_CREATE);

                    startActivity(new Intent("android.intent.action.CALL", Uri
                            .parse("tel:" + inputUSSD.getText().toString()
                                    + Uri.encode("#"))));
                }

            }
        });


    }
    ServiceConnection mConnecton = new ServiceConnection() {

        @Override
        public void onServiceDisconnected(ComponentName name) {
            mService = null;

        }

        @Override
        public void onServiceConnected(ComponentName name, IBinder iBinder) {
            mService = IExtendedNetworkService.Stub
                    .asInterface((IBinder) iBinder);
        }
    };

    protected void onDestroy() {
        super.onDestroy();
        Log.d("THANG-NGUYEN", "onDestroy");
        unbindService(mConnecton);
    }



}

显现

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

    <uses-sdk
        android:minSdkVersion="7"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.READ_SMS" />
    <uses-permission android:name="android.permission.WRITE_SMS" />
    <uses-permission android:name="android.permission.CALL_PHONE" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="info.example.checkussdcode.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="info.example.checkussdcode.service.UssdCodeService"
            android:process=":remote" >
            <intent-filter>
                <action android:name="com.android.ussd.IExtendedNetworkService" >
                </action>
            </intent-filter>
        </service>

        <receiver android:name="info.example.checkussdcode.RebootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>

</manifest>
4

0 回答 0