在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → Android 蓝牙连接,解决数据报文分段 实例源码

Android 蓝牙连接,解决数据报文分段 实例源码

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:7.82M
  • 下载次数:32
  • 浏览次数:1385
  • 发布时间:2014-08-29
  • 实例类别:Android平台开发
  • 发 布 人:crazycode
  • 文件格式:.zip
  • 所需积分:2
 相关标签: Android 蓝牙

实例介绍

【实例简介】
【实例截图】

【核心代码】

package com.forward.bluetooth;

import java.text.DecimalFormat;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.Animation;
import android.view.animation.LinearInterpolator;
import android.view.animation.RotateAnimation;
import android.view.animation.ScaleAnimation;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.forward.bluetooth.bluetooth.BluetoothCommService;
import com.forward.bluetooth.bluetooth.BluetoothEnvironment;
import com.forward.bluetooth.bluetooth.ConstantsBluetooth;
import com.forward.bluetooth.bluetooth.ScanBTDeviceActivity;
import com.forward.bluetooth.bluetooth.data.Datagram;

public class MainActivity extends Activity {

	private TextView tvSpeed1, tvSpeed2, tvSpeed3, tvSpeed4, tvSpeed5, tvSpeed6;
	private ImageView imgSpeed1 = null, imgSpeed2 = null, imgSpeed3 = null, imgSpeed4 = null, imgSpeed5 = null,
			imgSpeed6 = null;
	private ImageView imgDirectionArrow1, imgDirectionArrow2 = null;
	private TextView tvDirection1, tvDirection2;
	private ImageView imgTemperature = null, imgTemperaturePilar = null, imgHumidity = null, imgHumidityPilar = null,
			imgPressure = null, imgPressurePointer = null;
	private TextView tvTemperature, tvHumidity, tvPressure;

	private RotateAnimation animSpeed1, animSpeed2, animSpeed3, animSpeed4, animSpeed5, animSpeed6;
	private RotateAnimation animDirection1, animDirection2;
	private ScaleAnimation animTemperature, animHumidity;
	private RotateAnimation animPressure;
	private float currentDirection1 = 0, currentDirection2 = 0, currentTemperature = ConstantsEwins.MIN_TEMPERATURE_Y,
			currentHumidity = 0.0f, currentPressure = 0;
	DecimalFormat df = new DecimalFormat("0.00");

	private ImageButton btnOpenBT = null;
	private TextView tvDeviceName = null;

	private Datagram datagram = new Datagram();
	private BluetoothAdapter btAdapter;
	private BluetoothDevice mDevice;

	private int[] checked = new int[11];

	private long exitTime = 0;// 用于再按一次退出

	@SuppressLint("NewApi")
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		getBluetoothAdapter();

		findAllControls();

		initAnimations();

	}

	private void findAllControls() {
		imgSpeed1 = (ImageView) findViewById(R.id.imgSpeed1);
		imgSpeed2 = (ImageView) findViewById(R.id.imgSpeed2);
		imgSpeed3 = (ImageView) findViewById(R.id.imgSpeed3);
		imgSpeed4 = (ImageView) findViewById(R.id.imgSpeed4);
		imgSpeed5 = (ImageView) findViewById(R.id.imgSpeed5);
		imgSpeed6 = (ImageView) findViewById(R.id.imgSpeed6);
		tvSpeed1 = (TextView) findViewById(R.id.tvSpeed1);
		tvSpeed2 = (TextView) findViewById(R.id.tvSpeed2);
		tvSpeed3 = (TextView) findViewById(R.id.tvSpeed3);
		tvSpeed4 = (TextView) findViewById(R.id.tvSpeed4);
		tvSpeed5 = (TextView) findViewById(R.id.tvSpeed5);
		tvSpeed6 = (TextView) findViewById(R.id.tvSpeed6);

		imgDirectionArrow1 = (ImageView) findViewById(R.id.imgDirectionArrow1);
		imgDirectionArrow2 = (ImageView) findViewById(R.id.imgDirectionArrow2);
		tvDirection1 = (TextView) findViewById(R.id.tvDirection1);
		tvDirection2 = (TextView) findViewById(R.id.tvDirection2);

		imgTemperature = (ImageView) findViewById(R.id.imgTemperature);
		imgTemperaturePilar = (ImageView) findViewById(R.id.imgTemperaturePilar);
		imgHumidity = (ImageView) findViewById(R.id.imgHumidity);
		imgHumidityPilar = (ImageView) findViewById(R.id.imgHumidityPilar);
		imgPressure = (ImageView) findViewById(R.id.imgPressure);
		imgPressurePointer = (ImageView) findViewById(R.id.imgPressurePointer);
		tvTemperature = (TextView) findViewById(R.id.tvTemperature);
		tvHumidity = (TextView) findViewById(R.id.tvHumidity);
		tvPressure = (TextView) findViewById(R.id.tvPressure);

		btnOpenBT = (ImageButton) findViewById(R.id.btnOpenBT);
		btnOpenBT.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View arg0) {
				Intent intent = new Intent(MainActivity.this, ScanBTDeviceActivity.class);
				startActivityForResult(intent, ConstantsBluetooth.REQUEST_CONNECT_DEVICE);
			}
		});
		tvDeviceName = (TextView) findViewById(R.id.tvDeviceName);

		for (int i = 0; i < 11; i  )
			checked[i] = View.VISIBLE;
	}

	private void initAnimations() {
		animSpeed1 = new RotateAnimation(0, -360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		animSpeed1.setInterpolator(new LinearInterpolator());
		animSpeed1.setRepeatCount(-1);
		animSpeed1.setFillAfter(true);

		animSpeed2 = new RotateAnimation(0, -360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		animSpeed2.setInterpolator(new LinearInterpolator());
		animSpeed2.setRepeatCount(-1);
		animSpeed2.setFillAfter(true);

		animSpeed3 = new RotateAnimation(0, -360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		animSpeed3.setInterpolator(new LinearInterpolator());
		animSpeed3.setRepeatCount(-1);
		animSpeed3.setFillAfter(true);

		animSpeed4 = new RotateAnimation(0, -360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		animSpeed4.setInterpolator(new LinearInterpolator());
		animSpeed4.setRepeatCount(-1);
		animSpeed4.setFillAfter(true);

		animSpeed5 = new RotateAnimation(0, -360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		animSpeed5.setInterpolator(new LinearInterpolator());
		animSpeed5.setRepeatCount(-1);
		animSpeed5.setFillAfter(true);

		animSpeed6 = new RotateAnimation(0, -360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		animSpeed6.setInterpolator(new LinearInterpolator());
		animSpeed6.setRepeatCount(-1);
		animSpeed6.setFillAfter(true);

	}

	private void getBluetoothAdapter() {
		btAdapter = BluetoothAdapter.getDefaultAdapter();
		if (btAdapter == null) {
			Toast.makeText(MainActivity.this, "本设备不支持蓝牙", Toast.LENGTH_SHORT).show();
			finish();
			return;
		}
		while (!btAdapter.isEnabled()) {
			if (btAdapter.enable()) {
				Toast.makeText(MainActivity.this, "蓝牙已经启动", Toast.LENGTH_SHORT).show();
				break;
			} else {
				Toast.makeText(MainActivity.this, "蓝牙启动失败", Toast.LENGTH_SHORT).show();
				return;
			}
		}
		if (btAdapter.getScanMode() != BluetoothAdapter.SCAN_MODE_CONNECTABLE_DISCOVERABLE) {
			Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_DISCOVERABLE);
			intent.putExtra(BluetoothAdapter.EXTRA_DISCOVERABLE_DURATION, 300);
			startActivity(intent);
		}
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		menu.add(0, 1, 0, R.string.tianjiachuanganqi);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		if (item.getOrder() == 0) {
			Intent intent = new Intent(MainActivity.this, AddDeleteSensorsActivity.class);
			intent.putExtra("checked", checked);
			startActivityForResult(intent, ConstantsEwins.REQUEST_ADDDELETE_SENSORS);
		}
		return super.onOptionsItemSelected(item);
	}

	@Override
	protected void onResume() {
		System.out.println("------- ON RESUME ---------");
		super.onResume();
		if (BluetoothEnvironment.service != null) {
			if (btAdapter.isEnabled() && BluetoothEnvironment.service.getState() == ConstantsBluetooth.STATE_NONE) {
				BluetoothEnvironment.service.start();
			}
			BluetoothEnvironment.service.setHandler(mHandler, null);
		} else {
			BluetoothEnvironment.service = new BluetoothCommService(this, mHandler, null);
		}
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		switch (requestCode) {
		case ConstantsBluetooth.REQUEST_CONNECT_DEVICE:
			if (resultCode == RESULT_OK) {
				String address = data.getExtras().getString(ConstantsBluetooth.DEVICE_ADDRESS);
				mDevice = btAdapter.getRemoteDevice(address);
				if (mDevice == null)
					return;
				if (BluetoothEnvironment.service != null)
					BluetoothEnvironment.service.connect(mDevice);
			}
			break;
		case ConstantsEwins.REQUEST_ADDDELETE_SENSORS:
			if (resultCode == RESULT_OK) {
				checked = data.getExtras().getIntArray("checked");
				if (View.INVISIBLE == checked[0])
					imgSpeed1.clearAnimation();
				imgSpeed1.setVisibility(checked[0]);
				tvSpeed1.setVisibility(checked[0]);
				if (View.INVISIBLE == checked[1])
					imgSpeed2.clearAnimation();
				imgSpeed2.setVisibility(checked[1]);
				tvSpeed2.setVisibility(checked[1]);
				if (View.INVISIBLE == checked[2])
					imgSpeed3.clearAnimation();
				imgSpeed3.setVisibility(checked[2]);
				tvSpeed3.setVisibility(checked[2]);
				if (View.INVISIBLE == checked[3])
					imgSpeed4.clearAnimation();
				imgSpeed4.setVisibility(checked[3]);
				tvSpeed4.setVisibility(checked[3]);
				if (View.INVISIBLE == checked[4])
					imgSpeed5.clearAnimation();
				imgSpeed5.setVisibility(checked[4]);
				tvSpeed5.setVisibility(checked[4]);
				if (View.INVISIBLE == checked[5])
					imgSpeed6.clearAnimation();
				imgSpeed6.setVisibility(checked[5]);
				tvSpeed6.setVisibility(checked[5]);

				if (View.INVISIBLE == checked[6])
					imgDirectionArrow1.clearAnimation();
				imgDirectionArrow1.setVisibility(checked[6]);
				tvDirection1.setVisibility(checked[6]);
				if (View.INVISIBLE == checked[7])
					imgDirectionArrow2.clearAnimation();
				imgDirectionArrow2.setVisibility(checked[7]);
				tvDirection2.setVisibility(checked[7]);

				if (View.INVISIBLE == checked[8])
					imgTemperaturePilar.clearAnimation();
				imgTemperature.setVisibility(checked[8]);
				imgTemperaturePilar.setVisibility(checked[8]);
				tvTemperature.setVisibility(checked[8]);
				if (View.INVISIBLE == checked[9])
					imgHumidityPilar.clearAnimation();
				imgHumidity.setVisibility(checked[9]);
				imgHumidityPilar.setVisibility(checked[9]);
				tvHumidity.setVisibility(checked[9]);
				if (View.INVISIBLE == checked[10])
					imgPressurePointer.clearAnimation();
				imgPressure.setVisibility(checked[10]);
				imgPressurePointer.setVisibility(checked[10]);
				tvPressure.setVisibility(checked[10]);
			}
			break;
		default:
			break;
		}
	}

	@SuppressLint("HandlerLeak")
	private final Handler mHandler = new Handler() {
		int length = 0;
		boolean firstReceived = true;
		long lastReadTime = System.currentTimeMillis();
		StringBuffer sb = new StringBuffer(ConstantsEwins.DATA_LENGTH);

		@Override
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case ConstantsBluetooth.MESSAGE_STATE_CHANGE:
				switch (msg.arg1) {
				case ConstantsBluetooth.STATE_CONNECTED:
					Toast.makeText(MainActivity.this, "已连接至"   msg.obj   "!!fdasfds", Toast.LENGTH_SHORT).show();
					tvDeviceName.setText((String) msg.obj);
					btnOpenBT.setBackgroundResource(R.drawable.bluetooth_on);
					break;
				case ConstantsBluetooth.STATE_CONNECTING:
					Toast.makeText(MainActivity.this, "正在连接,请稍候", Toast.LENGTH_LONG).show();
					break;
				case ConstantsBluetooth.STATE_LISTEN:
					if (ConstantsBluetooth.CONNECTION_FAILED.equals(msg.obj)) {
						Toast.makeText(MainActivity.this, "连接不成功", Toast.LENGTH_SHORT).show();
						btnOpenBT.setBackgroundResource(R.drawable.bluetooth_off);
					} else if (ConstantsBluetooth.CONNECTION_LOST.equals(msg.obj)) {
						Toast.makeText(MainActivity.this, "连接丢失", Toast.LENGTH_SHORT).show();
						btnOpenBT.setBackgroundResource(R.drawable.bluetooth_off);
					}
					break;
				case ConstantsBluetooth.STATE_NONE:
					btnOpenBT.setBackgroundResource(R.drawable.bluetooth_off);
					break;
				}
				break;
			case ConstantsBluetooth.MESSAGE_WRITE:
				// byte[] writeBuf = (byte[]) msg.obj;
				break;
			case ConstantsBluetooth.MESSAGE_READ:
				if (firstReceived)
					lastReadTime = System.currentTimeMillis();
				// System.out.println("lastReadTime:"   lastReadTime);
				firstReceived = false;

				if (System.currentTimeMillis() - lastReadTime > ConstantsEwins.DATAGRAM_INTERVAL) {
					// System.out.println("超过500毫秒的数据"   sb.toString()   "长度为"  
					// length);
					if (length == ConstantsEwins.DATAGRAM_BYTES_LENGTH) {
						datagram.parseDatagram(sb.toString());
						modifyViews();
					}
					sb = new StringBuffer(ConstantsEwins.DATA_LENGTH);
					length = 0;
				}

				String data = (String) msg.obj;
				System.out.println("接收到的数据:"   data);
				length  = msg.arg1;
				sb.append(data);
				lastReadTime = System.currentTimeMillis();

				break;
			}
		}
	};

	@SuppressLint("NewApi")
	private void modifyViews() {
		tvSpeed1.setText("风速1: "   df.format(datagram.getSpeed1())   " m/s");
		tvSpeed2.setText("风速2: "   df.format(datagram.getSpeed2())   " m/s");
		tvSpeed3.setText("风速3: "   df.format(datagram.getSpeed3())   " m/s");
		tvSpeed4.setText("风速4: "   df.format(datagram.getSpeed4())   " m/s");
		tvSpeed5.setText("风速5: "   df.format(datagram.getSpeed5())   " m/s");
		tvSpeed6.setText("风速6: "   df.format(datagram.getSpeed6())   " m/s");
		tvDirection1.setText("风向1: "   (datagram.getDirection1() - (datagram.getDirection1() / 360) * 360)   "°");
		tvDirection2.setText("风向2: "   (datagram.getDirection2() - (datagram.getDirection2() / 360) * 360)   "°");
		tvTemperature.setText("温度: "   df.format(datagram.getTemperature())   " ℃");
		tvHumidity.setText("湿度: "   datagram.getHumidity()   " %");
		tvPressure.setText("气压: "   df.format(datagram.getPressure())   " kPa");

		// 风速改变
		long newDuration;
		newDuration = calcSpeedDuration(datagram.getSpeed1());
		if (animSpeed1.getDuration() != newDuration) {
			animSpeed1.setDuration(newDuration);
			if (View.INVISIBLE != imgSpeed1.getVisibility()) {
				imgSpeed1.clearAnimation();
				imgSpeed1.startAnimation(animSpeed1);
			}
		}
		newDuration = calcSpeedDuration(datagram.getSpeed2());
		if (animSpeed2.getDuration() != newDuration) {
			animSpeed2.setDuration(newDuration);
			if (View.INVISIBLE != imgSpeed2.getVisibility()) {
				imgSpeed2.clearAnimation();
				imgSpeed2.startAnimation(animSpeed1);
			}
		}
		newDuration = calcSpeedDuration(datagram.getSpeed3());
		if (animSpeed3.getDuration() != newDuration) {
			animSpeed3.setDuration(newDuration);
			if (View.INVISIBLE != imgSpeed3.getVisibility()) {
				imgSpeed3.clearAnimation();
				imgSpeed3.startAnimation(animSpeed3);
			}
		}
		newDuration = calcSpeedDuration(datagram.getSpeed4());
		if (animSpeed4.getDuration() != newDuration) {
			animSpeed4.setDuration(newDuration);
			if (View.INVISIBLE != imgSpeed4.getVisibility()) {
				imgSpeed4.clearAnimation();
				imgSpeed4.startAnimation(animSpeed4);
			}
		}
		newDuration = calcSpeedDuration(datagram.getSpeed5());
		if (animSpeed5.getDuration() != newDuration) {
			animSpeed5.setDuration(newDuration);
			if (View.INVISIBLE != imgSpeed5.getVisibility()) {
				imgSpeed5.clearAnimation();
				imgSpeed5.startAnimation(animSpeed5);
			}
		}
		newDuration = calcSpeedDuration(datagram.getSpeed6());
		if (animSpeed6.getDuration() != newDuration) {
			animSpeed6.setDuration(newDuration);
			if (View.INVISIBLE != imgSpeed6.getVisibility()) {
				imgSpeed6.clearAnimation();
				imgSpeed6.startAnimation(animSpeed6);
			}
		}

		// 风向改变
		animDirection1 = new RotateAnimation(currentDirection1, datagram.getDirection1(), Animation.RELATIVE_TO_SELF,
				0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		animDirection1.setDuration(500);
		animDirection1.setFillAfter(true);
		animDirection2 = new RotateAnimation(currentDirection2, datagram.getDirection2(), Animation.RELATIVE_TO_SELF,
				0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
		animDirection2.setDuration(500);
		animDirection2.setFillAfter(true);
		if (View.INVISIBLE != imgDirectionArrow1.getVisibility())
			imgDirectionArrow1.startAnimation(animDirection1);
		if (View.INVISIBLE != imgDirectionArrow2.getVisibility())
			imgDirectionArrow2.startAnimation(animDirection2);
		currentDirection1 = datagram.getDirection1();
		currentDirection2 = datagram.getDirection2();

		// 温度、湿度和气压
		float newTemperature = (datagram.getTemperature() - ConstantsEwins.MIN_TEMPERATURE_VALUE)
				* ConstantsEwins.TEMPERATURE_STEP   ConstantsEwins.MIN_TEMPERATURE_Y;
		float newHumidity = datagram.getHumidity() * ConstantsEwins.HUMIDITY_STEP   ConstantsEwins.MIN_HUMIDITY_Y;
		float newPressure = (datagram.getPressure() - ConstantsEwins.MIN_PRESSURE_VALUE) * ConstantsEwins.PRESSURE_STEP;

		animTemperature = new ScaleAnimation(1.0f, 1.0f, currentTemperature, newTemperature,
				Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0.8f);
		animTemperature.setDuration(500);
		animTemperature.setFillAfter(true);

		animHumidity = new ScaleAnimation(1.0f, 1.0f, currentHumidity, newHumidity, Animation.RELATIVE_TO_SELF, 0,
				Animation.RELATIVE_TO_SELF, 0.8f);
		animHumidity.setDuration(500);
		animHumidity.setFillAfter(true);

		animPressure = new RotateAnimation(currentPressure, newPressure, Animation.RELATIVE_TO_SELF, 0.5f,
				Animation.RELATIVE_TO_SELF, 0.5f);
		animPressure.setDuration(500);
		animPressure.setFillAfter(true);
		if (View.INVISIBLE != imgTemperaturePilar.getVisibility())
			imgTemperaturePilar.startAnimation(animTemperature);
		if (View.INVISIBLE != imgHumidityPilar.getVisibility())
			imgHumidityPilar.startAnimation(animHumidity);
		if (View.INVISIBLE != imgPressurePointer.getVisibility())
			imgPressurePointer.startAnimation(animPressure);
		currentTemperature = newTemperature;
		currentHumidity = newHumidity;
		currentPressure = newPressure;

	}

	private long calcSpeedDuration(float speed) {
		int level;
		if (speed < 1.5f)
			level = 1;
		else if (speed > 1.6 && speed < 5.4)
			level = 2;
		else if (speed > 5.5 && speed < 7.9)
			level = 3;
		else if (speed > 8.0 && speed < 10.7)
			level = 4;
		else if (speed > 10.8 && speed < 13.8)
			level = 5;
		else if (speed > 13.9 && speed < 17.1)
			level = 6;
		else if (speed > 17.2 && speed < 20.7)
			level = 7;
		else if (speed > 20.8 && speed < 24.4)
			level = 8;
		else if (speed > 24.5 && speed < 28.4)
			level = 9;
		else if (speed > 28.5 && speed < 32.6)
			level = 10;
		else
			level = 11;

		long duration;
		duration = (11 - level) * ConstantsEwins.SPEED_DURATION_STEP   ConstantsEwins.MIN_SPEED_DURATION;
		return duration;
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) {
			if ((System.currentTimeMillis() - exitTime) > 2000) {
				Toast.makeText(this, "再按一次退出程序", Toast.LENGTH_SHORT).show();
				exitTime = System.currentTimeMillis();
			} else {
				finish();
				System.exit(0);
			}
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

}

标签: Android 蓝牙

实例下载地址

Android 蓝牙连接,解决数据报文分段 实例源码

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 洛奇 发表于: 2016-03-17 10:49 42
我来说两句...吃

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警