问题
I have an application which gathers wifi and cellular data usage and sends it as a string of data via SMS - however I need a bit of help modifying the string it sends into the correct format
The way it appears now:
USI;1;3056090866;06/16/58/06/24/13;CN25.48,WN86.957;CN34.931,WN16.656
The way I would like it to send in the following manner: (with the second CN and WN changed to CO and WO)
USI;1;3056090866;06/16/58/06/24/13;CN25.48,WN86.957;CO34.931,WO16.656
How can this be accomplished? I've attempted to use:
info = info.replace("CN", "CN", "CN, "CO"");
and
info = info.replace("CN", "CO"");
but neither is giving the expected output
P.S.
Whatever method is suggested needs to take into account the numeric values in this string of data change - but the letters CN and WN (Cellular Network and Wireless network) stay the same - I simply need to change the 2nd CN and WN in the output to WO and CO
FULL SOURCE:
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;
private Intent getIntent() {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d(Constants.TAG, "Logging Service Started");
// super.onStartCommand(intent, flags, startId);
Bundle extras = intent.getExtras();
if (intent == null) {
// Exit gracefully is service not started by intent
Log.d(Constants.TAG, "Error: Null Intent");
} else {
if (extras != null) {
text = extras.getString(Constants.DM_SMS_CONTENT);
// check for Enable or Disable Value - if set to enable
// check for Enable or Disable Value - if set to enable
if (extras.getString(Constants.DM_SMS_CONTENT).contains(
"//USR;1")) {
SharedPreferences settings = getApplicationContext()
.getSharedPreferences(Constants.PREFS_NAME, 0);
// 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 status = (settings.getString("status", "0"));
String tag = ";";
String mobileStr = nf.format(mobileBytes);
String totalStr = nf.format(totalBytes);
// get the MDN
TelephonyManager tm = (TelephonyManager) this
.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;
}
// get the date
SimpleDateFormat s = new SimpleDateFormat(
"hh/mm/ss/MM/dd/yy");
String DToDevice = s.format(new Date());
String info = String.format("USI%sCN%s,WN%s", tag + status
+ tag + mdn + tag + DToDevice + tag, mobileStr,
totalStr + settings.getString("last_month", "0"));
info = "USI" + info.replace("USI", "");
// 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
SharedPreferences settings = getApplicationContext()
.getSharedPreferences(Constants.PREFS_NAME, 0);
Editor editor = settings.edit();
editor.putString("status", "0");
editor.commit();
stopSelf();
// check for Enable or Disable Value - if set to any other
// character
}
}
}
return START_NOT_STICKY;
}
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);
}
}
EDIT IN RESPONSE TO VISHAL'S RESPONSE:
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);
StringBuilder b = new StringBuilder();
b.replace(sms.lastIndexOf("CN") - 1, sms.lastIndexOf("CN") + 2, "CO" );
b.replace(sms.lastIndexOf("WN") - 1, sms.lastIndexOf("WN") + 2, "WO" );
sms = b.toString();
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);
}
}
回答1:
Try this code->
String str = "USI;1;3056090866;06/16/58/06/24/13;CN25.48,WN86.957;CN34.931,WN16.656";
StringBuilder b = new StringBuilder(str);
b.replace(str.lastIndexOf("CN") - 1, str.lastIndexOf("CN") + 2, "CO" );
b.replace(str.lastIndexOf("WN") - 1, str.lastIndexOf("WN") + 2, "WO" );
str = b.toString();
It will work..
回答2:
Amani, I agree that Vishal's answer above will work -- you just have to replace the String str he initializes at the top with your own data. Then run it through the latter four lines of code he posted.
At this stage we are all assuming that your data strings can only contain numbers in the "random" parts and that the literals CN and WO, will appear exactly two times. Your post scriptum in the question implies this. If they could appear more often, this solution would always replace the LAST occurences. If they could appear less often, this solution would throw an exception (i.e. it'll crash).
来源:https://stackoverflow.com/questions/17305105/info-info-replacecn-cn-cn-co-not-functioning-as-expected