public class MainActivity extends AppCompatActivity implements LotteryManager.OnCaptureDataListener, CompoundButton.OnCheckedChangeListener {
private LotteryManager mLotteryManager;
private TextView tv_show;
private Switch sw_open;
private RadioGroup rg_type;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_show = findViewById(R.id.tv_show);
sw_open = findViewById(R.id.sw_open);
rg_type = findViewById(R.id.rg_type);
mLotteryManager = new LotteryManager(this.getApplicationContext());
mLotteryManager.setOnCaptureDataListener(this);
//mLotteryManager.printSensors();
sw_open.setOnCheckedChangeListener(this);
sw_open.setChecked(true);
}
@Override
protected void onDestroy() {
super.onDestroy();
mLotteryManager.stop();
}
@Override
public void onCaptureStart() {
Dbg.print("onCaptureStart");
tv_show.setText("正在生成号码...");
tv_show.setTextColor(Color.RED);
}
@Override
public void onCaptureStop(String source, long seed) {
Dbg.print("seed=" + seed, "source=" + source);
Random random = new Random(seed); //得到真随机种子,再用java随机函数生成随机数
//以下生成五注彩票号码
tv_show.setTextColor(Color.BLACK);
tv_show.setText(null);
for (int i = 0; i < 5; i++) {
if (rg_type.getCheckedRadioButtonId() == R.id.rb_two_color) {
tv_show.append(makeTwoColorNumber(random));
}else {
tv_show.append(makeLargeLotteryNumber(random));
}
tv_show.append("\n");
}
}
private String makeTwoColorNumber(Random random) {
LinkedList<Integer> numbers = new LinkedList<>();
for (int i = 0; i < 33; i++) {
numbers.add(i + 1);
}
StringBuilder sb = new StringBuilder();
List<Integer> selectedNumbers = new ArrayList<>();
for (int i = 0; i < 6; i++) {
int index = random.nextInt(numbers.size());
selectedNumbers.add(numbers.get(index));
numbers.remove(index);
}
Collections.sort(selectedNumbers);
for (Integer selectedNumber : selectedNumbers) {
sb.append(String.format("%02d", selectedNumber)).append(" ");
}
sb.append("+ ");
sb.append(String.format("%02d", random.nextInt(16) + 1));
return sb.toString();
}
private String makeLargeLotteryNumber(Random random) {
//前区
LinkedList<Integer> frontNumbers = new LinkedList<>();
for (int i = 0; i < 35; i++) {
frontNumbers.add(i + 1);
}
StringBuilder sb = new StringBuilder();
List<Integer> selectedFrontNumbers = new ArrayList<>();
for (int i = 0; i < 5; i++) {
int index = random.nextInt(frontNumbers.size());
selectedFrontNumbers.add(frontNumbers.get(index));
frontNumbers.remove(index);
}
Collections.sort(selectedFrontNumbers);
//后区
LinkedList<Integer> backNumbers = new LinkedList<>();
for (int i = 0; i < 12; i++) {
backNumbers.add(i + 1);
}
List<Integer> selectedBackNumbers = new ArrayList<>();
for (int i = 0; i < 2; i++) {
int index = random.nextInt(backNumbers.size());
selectedBackNumbers.add(backNumbers.get(index));
backNumbers.remove(index);
}
Collections.sort(selectedBackNumbers);
for (Integer selectedNumber : selectedFrontNumbers) {
sb.append(String.format("%02d", selectedNumber)).append(" ");
}
sb.append("+ ");
for (Integer selectedNumber : selectedBackNumbers) {
sb.append(String.format("%02d", selectedNumber)).append(" ");
}
return sb.toString();
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
mLotteryManager.start();
} else {
mLotteryManager.stop();
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<Switch
android:id="@+id/sw_open"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="开启机器 " />
<RadioGroup
android:id="@+id/rg_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:orientation="horizontal">
<RadioButton
android:id="@+id/rb_two_color"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="双色球" />
<RadioButton
android:id="@+id/rb_large_lottery"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:checked="true"
android:text="大乐透" />
</RadioGroup>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center">
<TextView
android:id="@+id/tv_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=""
android:textColor="#000000"
android:textSize="24sp" />
</LinearLayout>
</LinearLayout>
public class LotteryManager implements SensorEventListener {
private static final String TAG = "LotteryManager";
private Context mContext;
private SensorManager mSensorManager;
private OnCaptureDataListener onCaptureDataListener;
private float x, y, z;
private long lastTime;
private boolean mEventStart;
private StringBuffer mDataSource = new StringBuffer();
public LotteryManager(Context mContext) {
this.mContext = mContext;
mSensorManager = (SensorManager) mContext.getSystemService(Service.SENSOR_SERVICE);
}
public void start() {
mSensorManager.registerListener(mDeviceEventListener, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_NORMAL);
}
public void stop() {
mSensorManager.unregisterListener(mDeviceEventListener);
captureEnd();
}
private SensorEventListener mDeviceEventListener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
if (event.values != null && event.values.length == 3) {
long time = (event.timestamp - lastTime);
if (time > 100000000) {
float x1 = Math.abs(event.values[0] - x);
float y1 = Math.abs(event.values[1] - y);
float z1 = Math.abs(event.values[2] - z);
float speed = (x1 + y1 + z1) / (float) time * 1000000000L;
//Dbg.print(speed);
lastTime = event.timestamp;
x = event.values[0];
y = event.values[1];
z = event.values[2];
if (speed > 80) {
if (!mEventStart) {
if (onCaptureDataListener != null) {
onCaptureDataListener.onCaptureStart();
}
capture();
mEventStart = true;
}
} else if (speed < 2) {
if (mEventStart) {
captureEnd();
String data = mDataSource.toString();
if (onCaptureDataListener != null) {
onCaptureDataListener.onCaptureStop(data, makeRandomSeed(data));
}
mEventStart = false;
}
}
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
private long makeRandomSeed(String source) {
if (source == null || source.isEmpty()) {
return 0;
}
try {
MessageDigest digest = MessageDigest.getInstance("SHA256");
digest.update(source.getBytes());
byte[] hashBytes = digest.digest();
BigInteger bi = new BigInteger(1, hashBytes);
return bi.remainder(BigInteger.valueOf(Long.MAX_VALUE)).longValue();
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
private void capture() {
mDataSource.setLength(0);
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
if (sensors != null) {
for (Sensor sensor : sensors) {
mSensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_FASTEST);
}
}
}
private void captureEnd() {
mSensorManager.unregisterListener(this);
}
@Override
public void onSensorChanged(SensorEvent event) {
mDataSource.append(event.timestamp).append("_");
if (event.values != null) {
for (float value : event.values) {
mDataSource.append(value).append("_");
}
/*StringBuilder sb = new StringBuilder();
for (float value : event.values) {
sb.append(value).append(",");
}
Dbg.print(event.sensor.getType(), sb);*/
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
public void setOnCaptureDataListener(OnCaptureDataListener onCaptureDataListener) {
this.onCaptureDataListener = onCaptureDataListener;
}
public interface OnCaptureDataListener {
void onCaptureStart();
void onCaptureStop(String source, long seed);
}
public void printSensors() {
List<Sensor> sensors = mSensorManager.getSensorList(Sensor.TYPE_ALL);
if (sensors != null) {
for (Sensor sensor : sensors) {
if (sensor.isWakeUpSensor()) {
Dbg.print(sensor.getType() + ", " + sensor.getName() + ", " + sensor.getStringType());
}
}
}
}
}
![](https://img-blog.csdnimg.cn/direct/4cfae18f6f884d5fbdf3e0e5067403c6.jpeg)