I'm new to android and I am creating a MAC spoofing app. I have created an IntentService to spoof the MAC address in the app every 5 seconds and it is working fine. Then I created a BaseActivity which all of my activities extend from, this is so I can detect when the app goes in the background or not, this is also working fine. I already have it so when the app is in the background, the MAC address no longer changes and goes back to its original, but instead of this I want to just stop the service when the app is in background and restart the service when the app is opened again. Here is my code so far:
BaseActivity
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.util.Log;
import android.widget.Toast;
public class BaseActivity extends Activity {
private static int sessionDepth = 0;
public static boolean isInBackground = false;
WifiManager wifiManager;
private Intent myIntent;
// app in foreground
@Override
protected void onStart() {
super.onStart();
sessionDepth++;
isInBackground = false;
// for MAC spoofing
myIntent = new Intent(this, IntentService.class);
startService(myIntent);
}
// app in background
@Override
protected void onStop() {
super.onStop();
if (sessionDepth > 0)
sessionDepth--;
if (sessionDepth == 0) {
Toast.makeText(getApplicationContext(), "App is in background",
Toast.LENGTH_SHORT).show();
isInBackground = true;
Log.d("My log2", "background " + isInBackground);
wifiManager = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(false); // restart wifi
wifiManager.setWifiEnabled(true);
stopService(myIntent);
}
}
@Override
protected void onPause() {
super.onPause();
stopService(myIntent);
}
public boolean getStatus(){
return isInBackground;
}
}
IntentService
package edu.fiu.mpact.reuproject;
import android.content.Intent;
import android.net.wifi.WifiManager;
import android.util.Log;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
public class IntentService extends android.app.IntentService {
Process p = null;
String[] ouiList;
Random gen = new Random();
char[] charList = {'A', 'B', 'C', 'D', 'E', 'F', '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9'};
public IntentService() {
super("MAC");
}
@Override
protected void onHandleIntent(Intent intent) {
try {
ouiList = loadOUIs();
} catch (IOException e) {
e.printStackTrace();
}
try {
p = Runtime.getRuntime().exec("su"); // prompt for root access
} catch (IOException e) {
e.printStackTrace();
}
new Timer().scheduleAtFixedRate(new TimerTask() {
BaseActivity b = new BaseActivity();
@Override
public void run() {
Log.d("my log2", b.getStatus() + "");
try {
if(!b.getStatus()) {
changeMac();
}
Log.d("my log3", Utils2.getMACAddress("wlan0"));
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
}
}, 0, 5000); // changes MAC every 3 seconds
}
private void changeMac() throws IOException, InterruptedException {
String mac = generateMac();
//commands to execute
String[] cmds = {"ip link set wlan0 address " + mac};
// execute the commands
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String tmpCmd : cmds) {
os.writeBytes(tmpCmd + "\n");
}
}
private String generateMac(){
String s = ouiList[gen.nextInt(20847)] + ":";
for(int i = 0; i < 6; i++){
s = s + charList[gen.nextInt(16)];
//add colon
if(((i + 1) % 2 == 0) && i != 5){
s = s + ":";
}
}
return s;
}
private String[] loadOUIs() throws IOException {
String[] ouiList = new String[20847];
int i = 0;
InputStream inStream = getApplicationContext().getResources().openRawResource(R.raw.oui2);
InputStreamReader is = new InputStreamReader(inStream);
BufferedReader reader = new BufferedReader(is);
String word = reader.readLine(); //read first OUI
while(word != null){ //continue until no more OUI's
ouiList[i] = word;
word = reader.readLine();
i++;
}
return ouiList;
}
}
For some reason the service is not stopping when the app goes to background, despite my stopService() calls.