Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
*.iml
.gradle
/local.properties
/.idea/libraries
/.idea/modules.xml
/.idea/workspace.xml
.DS_Store
/build
/captures
.externalNativeBuild
1 change: 1 addition & 0 deletions app/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/build
28 changes: 28 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 28
defaultConfig {
applicationId "com.nml.bt"
minSdkVersion 16
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
21 changes: 21 additions & 0 deletions app/proguard-rules.pro
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile
26 changes: 26 additions & 0 deletions app/src/androidTest/java/com/nml/bt/ExampleInstrumentedTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.nml.bt;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getTargetContext();

assertEquals("com.nml.bt", appContext.getPackageName());
}
}
25 changes: 25 additions & 0 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.nml.bt">

<!--权限配置-->
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>
171 changes: 171 additions & 0 deletions app/src/main/java/com/nml/bt/MainActivity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,171 @@
package com.nml.bt;

import android.bluetooth.BluetoothAdapter;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

/**
* 简介:1.蓝牙概述
* 2.蓝牙功能
* 3.如何获取本地蓝牙信息
* 4.如何绑定蓝牙
* 5.如何使用蓝牙进行数据传输
* @author niumenglin
*/
public class MainActivity extends AppCompatActivity {

public static final String TAG = "MainActivity";
/**
* 打开蓝牙请求码
*/
public static final int REQUEST_OPEN_BLUE_TOOTH = 0X01;

private TextView mTvStatus;
private Button mBtnOpenBlueTooth;
private BluetoothAdapter mBluetoothAdapter;

/**
* 蓝牙是否开启
*/
private boolean mIsOpen = false;

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

findViews();
init();
addListener();

}

private void findViews() {
mTvStatus = findViewById(R.id.tv_status);
mBtnOpenBlueTooth =findViewById(R.id.btn_open_bluetooth);
}

private void init() {
//获取本地蓝牙的适配器
mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
//判断蓝牙功能是否存在
if (mBluetoothAdapter == null){
showToast(getResources().getString(R.string.main_no_support));
return;
}

//获取名称与mac地址
String name = mBluetoothAdapter.getName();
String address = mBluetoothAdapter.getAddress();
Log.d(TAG,"name:"+name+"\n address:"+address);

//蓝牙状态:STATE_ON=已打开;STATE_TURNING_ON=正在打开;STATE_TURNING_OFF=正在关闭;STATE_OFF=已经关闭
int state = mBluetoothAdapter.getState();
switch (state){
case BluetoothAdapter.STATE_ON:
showToast("蓝牙已经打开");
break;
case BluetoothAdapter.STATE_TURNING_ON:
showToast("蓝牙正在打开...");
break;
case BluetoothAdapter.STATE_TURNING_OFF:
showToast("蓝牙正在关闭...");
break;
case BluetoothAdapter.STATE_OFF:
showToast("蓝牙已经关闭");
break;
}

}

@Override
protected void onResume() {
super.onResume();
getBlueToothStatus();
}

private void addListener() {

//打开蓝牙设备(前提是蓝牙是关闭状态)
mBtnOpenBlueTooth.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//判断蓝牙是否已经打开
mIsOpen = mBluetoothAdapter.isEnabled();
if (mIsOpen){
//关闭蓝牙
boolean isClose = mBluetoothAdapter.disable();
Log.e(TAG, "蓝牙是否关闭:" + isClose);
mTvStatus.setText(String.format(getString(R.string.main_bluetooth_status_string),"已关闭"));
mBtnOpenBlueTooth.setText(getResources().getString(R.string.main_open_bluetooth));
}else{
//蓝牙关闭状态-->打开蓝牙
// boolean isOpen = mBluetoothAdapter.enable();
// String str = String.format(getString(R.string.main_bluetooth_status),isOpen);
// Log.e(TAG, "str-->" + str);
// showToast(str);

//调用系统API打开蓝牙
Intent intent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(intent,REQUEST_OPEN_BLUE_TOOTH);
}

}
});
}

/**
* 回调函数
* @param requestCode 请求码
* @param resultCode 结果码
* @param data 返回数据
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_OPEN_BLUE_TOOTH){
if (resultCode == RESULT_CANCELED){
//失败
showToast(getResources().getString(R.string.main_request_fail));
}else{
//成功
showToast(getResources().getString(R.string.main_request_success));
mTvStatus.setText(String.format(getString(R.string.main_bluetooth_status_string),"已开启"));
mBtnOpenBlueTooth.setText(getResources().getString(R.string.main_close_bluetooth));
}
}
}

/**
* 提示
* @param msg
*/
private void showToast(String msg){
Toast.makeText(this,msg,Toast.LENGTH_LONG).show();
}

private void getBlueToothStatus(){
//判断蓝牙状态(开启或关闭)
mIsOpen = mBluetoothAdapter.isEnabled();
String statusStr;
String btnDesc;
if (mIsOpen){
statusStr = String.format(getString(R.string.main_bluetooth_status_string),"已开启");
btnDesc = getResources().getString(R.string.main_close_bluetooth);
}else{
statusStr = String.format(getString(R.string.main_bluetooth_status_string),"已关闭");
btnDesc = getResources().getString(R.string.main_open_bluetooth);
}
mTvStatus.setText(statusStr);
mBtnOpenBlueTooth.setText(btnDesc);
}


}
34 changes: 34 additions & 0 deletions app/src/main/res/drawable-v24/ic_launcher_foreground.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>
Loading