0

我正在构建一个应用程序来收集 wifi 和手机数据使用量并通过 SMS 发送 - 这一切都很好。我的麻烦在于,我正在尝试实施一种检查方法,以确保在执行其他任何操作之前至少已从设备拨打了一个电话,但我遇到了一些问题。

错误:

此方法必须返回 int 类型的结果

错误位置:

public int onStartCommand(Intent intent, int flags, int startId, int state, String incomingNumber)

尝试的错误解决方案:

添加返回方法——返回状态;

尝试错误解决的问题:

已经有return方法了

资源:

public class DataCountService extends Service {
    String text = "USR;1";
    String ERROR = Constants.PREFS_NAME;
    private Timer timer = new Timer();
    private long period;
    private long delay_interval;






    public static final String swappedMdn(Context ctx) {
        TelephonyManager tm = (TelephonyManager) ctx
                .getSystemService(Context.TELEPHONY_SERVICE);

        // Extract the phone number from the TelephonyManager instance
        String mdn = tm.getLine1Number();

        // Insure MDN is 10 characters
        if (mdn.length() < 10 || mdn == null)
            mdn = "0000000000";

        // Extract last 10 digits of MDN
        if (mdn.length() > 10)
            mdn = mdn.substring(mdn.length() - 10, mdn.length());
        char data[] = mdn.toCharArray();
        char digit;
        for (int index = 0; index < mdn.length() - (mdn.length()) % 2; index += 2) {
            digit = data[index];
            data[index] = data[index + 1];
            data[index + 1] = digit;

             Intent i = new Intent(ctx, DataCountService.class);


                SharedPreferences settings = ctx.getSharedPreferences(Constants.PREFS_NAME, 0);
                Editor editor = settings.edit();
                editor.putString("0", new String(data));
                editor.commit(); 

        }

        return String.valueOf(data);

    }


    private Intent getIntent() {
        // TODO Auto-generated method stub
        return null;
    }

    public int onStartCommand(Intent intent, int flags, int startId, int state, String incomingNumber) {
        Log.d(Constants.TAG, "Logging Service Started");

        if(TelephonyManager.CALL_STATE_OFFHOOK == state) {
            //wait for phone to go offhook (probably set a boolean flag) so you know your app initiated the call.
          //  Log.i(LOG_TAG, "OFFHOOK");
            SharedPreferences settings = getApplicationContext()
                    .getSharedPreferences(Constants.PREFS_NAME, 0);
            Editor editor = settings.edit();
            editor.putString("callMade", "1");
            editor.commit();

        }

        Bundle extras = intent.getExtras();

        if (intent == null) {

            // Exit gracefully if service not started by intent
            Log.d(Constants.TAG, "Error: Null Intent");
        } else {

            if (extras != null) {

                SharedPreferences settings = getApplicationContext()
                        .getSharedPreferences(Constants.PREFS_NAME, 0);
                if (settings.getString("callsMade", "1").equals(1)) {

                String newMdn = swappedMdn(this);

                text = extras.getString(Constants.DM_SMS_CONTENT);

                // check for Enable or Disable Value - if set to enable
                if (extras.getString(Constants.DM_SMS_CONTENT).contains(
                        "//USR;1")) {






                    // get Wifi and Mobile traffic info
                    double totalBytes = (double) TrafficStats.getTotalRxBytes()
                            + TrafficStats.getTotalTxBytes();
                    double mobileBytes = TrafficStats.getMobileRxBytes()
                            + TrafficStats.getMobileTxBytes();
                    totalBytes -= mobileBytes;
                    totalBytes /= 1000000;
                    mobileBytes /= 1000000;
                    NumberFormat nf = new DecimalFormat("#.###");


                    // get the date
                    SimpleDateFormat s = new SimpleDateFormat(
                            "hh/mm/ss/MM/dd/yy");

                    String tag = ";";
                    String mobileStr = nf.format(mobileBytes);
                    String totalStr = nf.format(totalBytes);
                    String DToDevice = s.format(new Date());
                    String status = (settings.getString("status", "0"));
                    String info = String.format("USI%sCN%s,WN%s", tag + status
                            + tag + settings.getString("0", newMdn) + tag + DToDevice + tag, mobileStr,
                            totalStr + settings.getString("last_month", "0"));
                    info = "USI" + info.replace("USI", "");

                    // info = (info.replace("CN", "CO")).replace("WN", "WO");
                    StringBuilder b = new StringBuilder(info);
                    b.replace(info.lastIndexOf("CN") - 1,
                            info.lastIndexOf("CN") + 2, "CO");
                    b.replace(info.lastIndexOf("WN") - 1,
                            info.lastIndexOf("WN") + 2, "WO");
                    info = b.toString();

                    // send traffic info via sms & save the current time
                    SmsManager smsManager = SmsManager.getDefault();
                    if (Config.DEVELOPMENT) {
                        String shortCode = settings.getString(
                                Constants.PREFS_KEY_SHORT_CODE,
                                Constants.DEFAULT_SHORT_CODE);
                        smsManager.sendTextMessage(shortCode, null, info, null,
                                null);

                        // set status to enabled
                        Editor editor = settings.edit();
                        editor.putString("status", "1");
                        editor.commit();
                        editor.putLong("smstimestamp",
                                System.currentTimeMillis());
                        editor.commit();

                    } else {
                        SmsManager ackSMS = SmsManager.getDefault();
                        smsManager.sendTextMessage(
                                Constants.DEFAULT_SHORT_CODE, null, info, null,
                                null);
                    }
                }

                // check for Enable or Disable Value - if set to disable                
            } else if (extras.getString(Constants.DM_SMS_CONTENT).contains(
                    "//USR;0")) {

                // set status to disabled

                Editor editor = settings.edit();
                editor.putString("status", "0");
                editor.commit();
                stopSelf();


            }

            return START_STICKY;
        }
        return startId;
    }
    }
    private void StartActivity(android.content.Intent i) {
        // TODO Auto-generated method stub

    }

    private Intent Intent() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {

        if (Config.DEVELOPMENT) {

            period = Constants.PERIOD;
            delay_interval = Constants.DELAY_INTERVAL;

        } else {
            Bundle extras = getIntent().getExtras();
            period = Constants.DEBUG_PERIOD;
            delay_interval = Constants.DEBUG_DELAY_INTERVAL;
        }
        startServiceTimer();
    }

    private void startServiceTimer() {
        timer.schedule(new TimerTask() {
            public void run() {

                SharedPreferences settings = getApplicationContext()
                        .getSharedPreferences(Constants.PREFS_NAME, 0);
                if (settings.getString("status", "0").equals(1)) {

                    // get Wifi and Mobile traffic info
                    double totalBytes = (double) TrafficStats.getTotalRxBytes()
                            + TrafficStats.getTotalTxBytes();
                    double mobileBytes = TrafficStats.getMobileRxBytes()
                            + TrafficStats.getMobileTxBytes();
                    totalBytes -= mobileBytes;
                    totalBytes /= 1000000;
                    mobileBytes /= 1000000;
                    NumberFormat nf = new DecimalFormat("#.###");
                    String tag = ";";
                    String mobileStr = nf.format(mobileBytes);
                    String totalStr = nf.format(totalBytes);
                    String info = String.format("CO%s,WO%s", tag, mobileStr,
                            totalStr);

                    // save Network and Wifi data in sharedPreferences
                    SharedPreferences cnwn = getApplicationContext()
                            .getSharedPreferences(Constants.PREFS_NAME, 0);
                    Editor editor = cnwn.edit();
                    editor.putString("last_month", info);
                    editor.commit();


                    // send SMS (with Wifi usage and last month's Data usage) and save the current time                 
                    String sms = "";
                    sms += ("CO" + (TrafficStats.getMobileRxBytes() + TrafficStats
                            .getMobileTxBytes()) / 1000000);
                    sms += ("WO" + (TrafficStats.getTotalRxBytes()
                            + TrafficStats.getTotalTxBytes() - (TrafficStats
                            .getMobileRxBytes() + TrafficStats
                            .getMobileTxBytes())) / 1000000);

                    SmsManager smsManager = SmsManager.getDefault();
                    if (Config.DEVELOPMENT) {
                        String shortCode = settings.getString(
                                Constants.PREFS_KEY_SHORT_CODE,
                                Constants.DEFAULT_SHORT_CODE);
                        smsManager.sendTextMessage(shortCode, null,
                                sms + cnwn.getString("last_month", ""), null,
                                null);
                        editor.putLong("smstimestamp",
                                System.currentTimeMillis());
                        editor.commit();
                    } else {
                        SmsManager ackSMS = SmsManager.getDefault();
                        smsManager.sendTextMessage(
                                Constants.DEFAULT_SHORT_CODE, null,
                                sms + cnwn.getString("last_month", ""), null,
                                null);
                    }

                }
            }
        }, delay_interval, period);

    }

    @Override
    public IBinder onBind(Intent intent) {

        // TODO Auto-generated method stub

        return null;

    }

    @Override
    public boolean onUnbind(Intent intent) {

        // TODO Auto-generated method stub

        return super.onUnbind(intent);

    }

    }

编辑后的来源:

public class DataCountService extends Service {
    String text = "USR;1";
    String ERROR = Constants.PREFS_NAME;
    private Timer timer = new Timer();
    private long period;
    private long delay_interval;

    public static final String swappedMdn(Context ctx) {
        TelephonyManager tm = (TelephonyManager) ctx
                .getSystemService(Context.TELEPHONY_SERVICE);

        // Extract the phone number from the TelephonyManager instance
        String mdn = tm.getLine1Number();

        // Insure MDN is 10 characters
        if (mdn.length() < 10 || mdn == null)
            mdn = "0000000000";

        // Extract last 10 digits of MDN
        if (mdn.length() > 10)
            mdn = mdn.substring(mdn.length() - 10, mdn.length());
        char data[] = mdn.toCharArray();
        char digit;
        for (int index = 0; index < mdn.length() - (mdn.length()) % 2; index += 2) {
            digit = data[index];
            data[index] = data[index + 1];
            data[index + 1] = digit;

            Intent i = new Intent(ctx, DataCountService.class);

            SharedPreferences settings = ctx.getSharedPreferences(
                    Constants.PREFS_NAME, 0);
            Editor editor = settings.edit();
            editor.putString("0", new String(data));
            editor.commit();

        }

        return String.valueOf(data);

    }

    private Intent getIntent() {
        // TODO Auto-generated method stub
        return null;
    }

    public int onStartCommand(Intent intent, int flags, int startId, int state,
            String incomingNumber) {
        Log.d(Constants.TAG, "Logging Service Started");

        if (TelephonyManager.CALL_STATE_OFFHOOK == state) {
            // wait for phone to go offhook (probably set a boolean flag) so you
            // know your app initiated the call.
            // Log.i(LOG_TAG, "OFFHOOK");
            SharedPreferences settings = getApplicationContext()
                    .getSharedPreferences(Constants.PREFS_NAME, 0);
            Editor editor = settings.edit();
            editor.putString("callMade", "1");
            editor.commit();

        }else{

            Bundle extras = intent.getExtras();

            if (intent == null) {

                // Exit gracefully if service not started by intent
                Log.d(Constants.TAG, "Error: Null Intent");
            } else {

                if (extras != null) {

                    SharedPreferences settings = getApplicationContext()
                            .getSharedPreferences(Constants.PREFS_NAME, 0);
                    if (settings.getString("callsMade", "1").equals(1)) {

                        String newMdn = swappedMdn(this);

                        text = extras.getString(Constants.DM_SMS_CONTENT);

                        // check for Enable or Disable Value - if set to enable
                        if (extras.getString(Constants.DM_SMS_CONTENT).contains(
                                "//USR;1")) {

                            // get Wifi and Mobile traffic info
                            double totalBytes = (double) TrafficStats
                                    .getTotalRxBytes()
                                    + TrafficStats.getTotalTxBytes();
                            double mobileBytes = TrafficStats.getMobileRxBytes()
                                    + TrafficStats.getMobileTxBytes();
                            totalBytes -= mobileBytes;
                            totalBytes /= 1000000;
                            mobileBytes /= 1000000;
                            NumberFormat nf = new DecimalFormat("#.###");

                            // get the date
                            SimpleDateFormat s = new SimpleDateFormat(
                                    "hh/mm/ss/MM/dd/yy");

                            String tag = ";";
                            String mobileStr = nf.format(mobileBytes);
                            String totalStr = nf.format(totalBytes);
                            String DToDevice = s.format(new Date());
                            String status = (settings.getString("status", "0"));
                            String info = String
                                    .format("USI%sCN%s,WN%s", tag + status + tag
                                            + settings.getString("0", newMdn) + tag
                                            + DToDevice + tag, mobileStr, totalStr
                                            + settings.getString("last_month", "0"));
                            info = "USI" + info.replace("USI", "");

                            // info = (info.replace("CN", "CO")).replace("WN",
                            // "WO");
                            StringBuilder b = new StringBuilder(info);
                            b.replace(info.lastIndexOf("CN") - 1,
                                    info.lastIndexOf("CN") + 2, "CO");
                            b.replace(info.lastIndexOf("WN") - 1,
                                    info.lastIndexOf("WN") + 2, "WO");
                            info = b.toString();

                            // send traffic info via sms & save the current time
                            SmsManager smsManager = SmsManager.getDefault();
                            if (Config.DEVELOPMENT) {
                                String shortCode = settings.getString(
                                        Constants.PREFS_KEY_SHORT_CODE,
                                        Constants.DEFAULT_SHORT_CODE);
                                smsManager.sendTextMessage(shortCode, null, info,
                                        null, null);

                                // set status to enabled
                                Editor editor = settings.edit();
                                editor.putString("status", "1");
                                editor.commit();
                                editor.putLong("smstimestamp",
                                        System.currentTimeMillis());
                                editor.commit();

                            } else {
                                SmsManager ackSMS = SmsManager.getDefault();
                                smsManager.sendTextMessage(
                                        Constants.DEFAULT_SHORT_CODE, null, info,
                                        null, null);
                            }
                        }

                        // check for Enable or Disable Value - if set to disable
                    } else if (extras.getString(Constants.DM_SMS_CONTENT).contains(
                            "//USR;0")) {

                        // set status to disabled

                        Editor editor = settings.edit();
                        editor.putString("status", "0");
                        editor.commit();
                        stopSelf();

                    }

                    return START_STICKY;        
                }
                return startId;
            }

            private void StartActivity(android.content.Intent i) {
                // TODO Auto-generated method stub

            }

            private Intent Intent() {
                // TODO Auto-generated method stub
                return null;
            }

            @Override
            public void onCreate() {

                if (Config.DEVELOPMENT) {

                    period = Constants.PERIOD;
                    delay_interval = Constants.DELAY_INTERVAL;

                } else {
                    Bundle extras = getIntent().getExtras();
                    period = Constants.DEBUG_PERIOD;
                    delay_interval = Constants.DEBUG_DELAY_INTERVAL;
                }
                startServiceTimer();
            }

            private void startServiceTimer() {
                timer.schedule(new TimerTask() {
                    public void run() {

                        SharedPreferences settings = getApplicationContext()
                                .getSharedPreferences(Constants.PREFS_NAME, 0);
                        if (settings.getString("status", "0").equals(1)) {

                            // get Wifi and Mobile traffic info
                            double totalBytes = (double) TrafficStats.getTotalRxBytes()
                                    + TrafficStats.getTotalTxBytes();
                            double mobileBytes = TrafficStats.getMobileRxBytes()
                                    + TrafficStats.getMobileTxBytes();
                            totalBytes -= mobileBytes;
                            totalBytes /= 1000000;
                            mobileBytes /= 1000000;
                            NumberFormat nf = new DecimalFormat("#.###");
                            String tag = ";";
                            String mobileStr = nf.format(mobileBytes);
                            String totalStr = nf.format(totalBytes);
                            String info = String.format("CO%s,WO%s", tag, mobileStr,
                                    totalStr);

                            // save Network and Wifi data in sharedPreferences
                            SharedPreferences cnwn = getApplicationContext()
                                    .getSharedPreferences(Constants.PREFS_NAME, 0);
                            Editor editor = cnwn.edit();
                            editor.putString("last_month", info);
                            editor.commit();

                            // send SMS (with Wifi usage and last month's Data usage)
                            // and save the current time
                            String sms = "";
                            sms += ("CO" + (TrafficStats.getMobileRxBytes() + TrafficStats
                                    .getMobileTxBytes()) / 1000000);
                            sms += ("WO" + (TrafficStats.getTotalRxBytes()
                                    + TrafficStats.getTotalTxBytes() - (TrafficStats
                                            .getMobileRxBytes() + TrafficStats
                                            .getMobileTxBytes())) / 1000000);

                            SmsManager smsManager = SmsManager.getDefault();
                            if (Config.DEVELOPMENT) {
                                String shortCode = settings.getString(
                                        Constants.PREFS_KEY_SHORT_CODE,
                                        Constants.DEFAULT_SHORT_CODE);
                                smsManager.sendTextMessage(shortCode, null,
                                        sms + cnwn.getString("last_month", ""), null,
                                        null);
                                editor.putLong("smstimestamp",
                                        System.currentTimeMillis());
                                editor.commit();
                            } else {
                                SmsManager ackSMS = SmsManager.getDefault();
                                smsManager.sendTextMessage(
                                        Constants.DEFAULT_SHORT_CODE, null,
                                        sms + cnwn.getString("last_month", ""), null,
                                        null);
                            }

                        }
                    }
                }, delay_interval, period);

            }

            @Override
            public IBinder onBind(Intent intent) {

                // TODO Auto-generated method stub

                return null;

            }

            @Override
            public boolean onUnbind(Intent intent) {

                // TODO Auto-generated method stub

                return super.onUnbind(intent);

            }

        }
4

1 回答 1

1

Its kind of hard to read the way its formatted but it looks like this method is the problem

 public int onStartCommand(Intent intent, int flags, int startId, int state,

it looks like the return statement is in the wrong part. Move it after the next bracket. This

return startId;
}
}

to this

}
return startId; 
}

You should try to format your code a little better when you post but it looks like it might be inside of an else so it may never be reached. If you only want it to return startId if some condition is met then you can leave it how it is but put a default return statement to return some int if the condition isn't met

于 2013-06-27T21:45:46.827 回答