增加 RFID扫描

idata
wangh 1 year ago
parent c5f1a42159
commit feb6624347

@ -14,6 +14,10 @@ android {
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
ndk {
// SO
abiFilters 'armeabi' , 'armeabi-v7a'
}
}
buildTypes {
@ -37,6 +41,8 @@ dependencies {
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.8.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
implementation files('libs\\uhflonger_v1.3.jar')
implementation files('libs\\ModuleAPI_J.jar')
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'

Binary file not shown.

Binary file not shown.

@ -5,35 +5,79 @@ import androidx.databinding.DataBindingUtil;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import com.example.beijing_daxing.adapter.InAdapter;
import com.example.beijing_daxing.base.AdapterClickCall;
import com.example.beijing_daxing.base.BaseActivity;
import com.example.beijing_daxing.base.MyRecultCall;
import com.example.beijing_daxing.base.MyResult;
import com.example.beijing_daxing.been.InStoreSelectBody;
import com.example.beijing_daxing.databinding.ActivityInBinding;
import com.example.beijing_daxing.vm.InStoreVM;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.model.Response;
public class InActivity extends BaseActivity {
import java.util.ArrayList;
import java.util.List;
public class InActivity extends BaseActivity implements AdapterClickCall {
private InStoreVM vm;
private InAdapter adapter;
private List<String> epcList;
private ActivityInBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityInBinding binding= DataBindingUtil.setContentView(this,R.layout.activity_in);
binding = DataBindingUtil.setContentView(this, R.layout.activity_in);
vm = new InStoreVM();
binding.setVm(vm);
initRequest();
adapter=new InAdapter(this);
epcList=new ArrayList<>();
adapter.setList(epcList);
adapter.setAdapterClickCall(this);
binding.setAdapter(adapter);
}
@Override
protected void sanRfid(List<String> epcs) {
// Log.e("TAG", "sanRfid:" + epcs);
epcs.stream().forEach(t->{
if (!epcList.contains(t)){
epcList.add(t);
}
});
vm.setSanLength(epcList.size());
adapter.notifyDataSetChanged();
}
private void initRequest() {
OkGo.<MyResult>post(url+"/instore/select")
OkGo.<MyResult>post(url + "/instore/select")
.tag(this)
.execute(new MyRecultCall(dialog,this){
.execute(new MyRecultCall(dialog, this) {
@Override
public void onSuccess(Response<MyResult> response) {
super.onSuccess(response);
// Log.e("TAG", "onSuccess:" + );response.body()
InStoreSelectBody inStoreSelectBody = gson.fromJson(response.body().getData().toString(),InStoreSelectBody.class);
InStoreSelectBody inStoreSelectBody = gson.fromJson(response.body().getData().toString(), InStoreSelectBody.class);
vm.initSelect(inStoreSelectBody.getBaseLocationList(), inStoreSelectBody.getBaseManufacturerList());
}
});
}
@Override
public void clickItem(int index) {
epcList.remove(index);
adapter.notifyDataSetChanged();
vm.setSanLength(epcList.size());
}
public void in_submit(View view){
String binchCode = vm.getBinchCode();
if (binchCode==null||epcList.isEmpty()) return;
OkGo.<MyResult>post(url+"/")
}
}

@ -18,6 +18,8 @@ import com.lzy.okgo.OkGo;
import com.lzy.okgo.callback.StringCallback;
import com.lzy.okgo.model.Response;
import java.util.List;
public class MainActivity extends BaseActivity {
private LoginVm loginVm;
@Override
@ -35,7 +37,12 @@ public class MainActivity extends BaseActivity {
}
public void login_click(View view){
@Override
protected void sanRfid(List<String> epcs) {
}
public void login_click(View view){
String pass = loginVm.getPass();
String name = loginVm.getName();
if (pass==null|| name==null||pass.isEmpty()||name.isEmpty()) return;

@ -0,0 +1,75 @@
package com.example.beijing_daxing.adapter;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.RecyclerView;
import com.example.beijing_daxing.R;
import com.example.beijing_daxing.base.AdapterClickCall;
import com.example.beijing_daxing.databinding.ItemInBinding;
import java.util.List;
/**
* @author wanghao
* @date 2024/1/16 15:26
*/
public class InAdapter extends RecyclerView.Adapter<InAdapter.MyViewHolder> {
private List<String> list;
private Context context;
private LayoutInflater inflater;
private AdapterClickCall adapterClickCall;
public InAdapter(Context context) {
this.context = context;
inflater=LayoutInflater.from(context);
}
public void setAdapterClickCall(AdapterClickCall adapterClickCall) {
this.adapterClickCall = adapterClickCall;
}
public void setList(List<String> list) {
this.list = list;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
ItemInBinding binding= DataBindingUtil.inflate(inflater, R.layout.item_in,parent,false);
return new MyViewHolder(binding);
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
String epc=list.get(position);
ItemInBinding binding = holder.getBinding();
binding.setEpc(epc);
binding.setIndex(String.valueOf(position+1));
binding.itemButtom.setOnClickListener(v -> {
adapterClickCall.clickItem(position);
});
}
@Override
public int getItemCount() {
return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private ItemInBinding binding;
public MyViewHolder( ItemInBinding binding) {
super(binding.getRoot());
this.binding = binding;
}
public ItemInBinding getBinding() {
return binding;
}
}
}

@ -0,0 +1,9 @@
package com.example.beijing_daxing.base;
/**
* @author wanghao
* @date 2024/1/16 15:42
*/
public interface AdapterClickCall {
void clickItem(int index);
}

@ -6,29 +6,53 @@ import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.view.Window;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import com.example.beijing_daxing.R;
import com.google.gson.Gson;
import com.handheld.UHFLonger.UHFLongerManager;
import java.util.List;
import okhttp3.MediaType;
public abstract class BaseActivity extends AppCompatActivity {
public static String url = "http://192.168.0.102:90/api";
// public static String url = "http://192.168.0.102:90/api";
public static String url = "http://172.20.10.2:90/api";
public ProgressDialog dialog;
public Gson gson;
public MediaType JSON = MediaType.parse("application/json; charset=utf-8");
public UHFLongerManager uhfLongerManager;
private MediaPlayer mediaPlayer;
private MyReceiver myReceiver;
@SuppressLint("UnspecifiedRegisterReceiverFlag")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
IntentFilter intentFilter = new IntentFilter("com.honeywell.scan.broadcast");
gson = new Gson();
initDialog();
initSan();
}
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (!intent.getBooleanExtra("keydown", false)) {
List<String> strings = uhfLongerManager.inventoryRealTime();
if (strings == null || strings.isEmpty()) {
return;
}
mediaPlayer.start();
sanRfid(strings);
}
}
}
private void initDialog() {
@ -38,18 +62,22 @@ public abstract class BaseActivity extends AppCompatActivity {
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setMessage("请求网络...");
}
private void initSan(){
uhfLongerManager = MyApplication.getUhfLongerManager();
// intentFilter.addAction("android.intent.action.FUN_KEY");
myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.rfid.FUN_KEY");
registerReceiver(myReceiver, intentFilter);
mediaPlayer = MediaPlayer.create(this, R.raw.msg);
}
// protected abstract void sanInfo(String code);
//
// public void goodsNameCall(String code) {
//
// }
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
protected abstract void sanRfid(List<String> epcs);
}

@ -3,6 +3,7 @@ package com.example.beijing_daxing.base;
import android.app.Application;
import com.example.beijing_daxing.uitls.SharedPreferencesUtils;
import com.handheld.UHFLonger.UHFLongerManager;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.cache.CacheEntity;
import com.lzy.okgo.cache.CacheMode;
@ -25,17 +26,27 @@ import okhttp3.OkHttpClient;
public class MyApplication extends Application {
MyApplication application;
public static UHFLongerManager uhfLongerManager;
@Override
public void onCreate() {
super.onCreate();
application = this;
SharedPreferencesUtils.init(getApplicationContext(), "myapp");
okGoBase();
getUhfLongerManager();
}
public static UHFLongerManager getUhfLongerManager() {
if (uhfLongerManager==null){
try {
uhfLongerManager = UHFLongerManager.getInstance();
uhfLongerManager.setOutPower((short) 30);
} catch (Exception e) {
e.printStackTrace();
}
}
return uhfLongerManager;
}
// OKGO 初始化
private void okGoBase() {
OkHttpClient.Builder builder = new OkHttpClient.Builder();

@ -0,0 +1,28 @@
package com.example.beijing_daxing.uitls;
public class HexAscii {
// String明文转ASCII码hex字符串,一个明文字符生成两个字符表示的16进制ASCII码
public static String str2Hex(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
// 这里的第二个参数16表示十六进制
sb.append(Integer.toString(c, 16));
// 或用toHexString方法直接转成16进制
// sb.append(Integer.toHexString(c));
}
return sb.toString();
}
// ASCII码hex字符串转String明文
public static String hex2Str(String hex) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hex.length() - 1; i += 2) {
String h = hex.substring(i, (i + 2));
int decimal = Integer.parseInt(h, 16);
sb.append((char) decimal);
}
return sb.toString();
}
}

@ -1,12 +1,76 @@
package com.example.beijing_daxing.vm;
import android.view.View;
import android.widget.AdapterView;
import androidx.databinding.BaseObservable;
import androidx.recyclerview.widget.RecyclerView;
import com.example.beijing_daxing.entity.BaseLocation;
import com.example.beijing_daxing.entity.BaseManufacturer;
import java.util.ArrayList;
import java.util.List;
/**
* @author wanghao
* @date 2024/1/11 16:21
*/
public class InStoreVM {
// private List<String>
public class InStoreVM extends BaseObservable {
private List<String> manus;
private List<String> locations;
private String binchCode;
private int sanLength;
private String selectManuText;
private String selectLocationText;
public void selectManus(AdapterView<?> parent, View view, int position, long id) {
selectManuText = manus.get(position);
}
public void selectLocation(AdapterView<?> parent, View view, int position, long id) {
selectLocationText = locations.get(position);
}
public String getSelectManuText() {
return selectManuText;
}
public String getSelectLocationText() {
return selectLocationText;
}
public List<String> getManus() {
return manus;
}
public List<String> getLocations() {
return locations;
}
public void initSelect(List<BaseLocation> baseLocationList, List<BaseManufacturer> baseManufacturerList) {
manus=new ArrayList<>();
locations=new ArrayList<>();
baseLocationList.forEach(t -> this.locations.add(t.getLocationCode()));
baseManufacturerList.forEach(t -> this.manus.add(t.getManufacturerName()));
notifyChange();
}
public String getBinchCode() {
return binchCode;
}
public void setBinchCode(String binchCode) {
this.binchCode = binchCode;
}
public int getSanLength() {
return sanLength;
}
public void setSanLength(int sanLength) {
this.sanLength = sanLength;
notifyChange();
}
}

@ -5,7 +5,12 @@
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="vm"
type="com.example.beijing_daxing.vm.InStoreVM" />
<variable
name="adapter"
type="com.example.beijing_daxing.adapter.InAdapter" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
@ -30,6 +35,8 @@
android:layout_marginTop="12dp"
android:background="@color/white"
android:padding="10dp"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
android:adapter="@{adapter}"
app:layout_constraintTop_toBottomOf="@+id/textView3"
tools:layout_editor_absoluteX="0dp" />
@ -48,7 +55,7 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="22" />
android:text='@={vm.sanLength+""}' />
</LinearLayout>
<LinearLayout
@ -76,7 +83,8 @@
android:layout_gravity="center"
android:imeOptions="actionDone"
android:maxLines="1"
android:singleLine="true" />
android:singleLine="true"
android:text="@={vm.binchCode}"/>
</LinearLayout>
<LinearLayout
@ -93,9 +101,10 @@
android:text="选择厂家:" />
<Spinner
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"
android:entries="@{vm.manus}"
android:onItemSelected="@{vm.selectManus}"/>
</LinearLayout>
<LinearLayout
@ -113,16 +122,19 @@
<Spinner
android:layout_width="match_parent"
android:layout_height="match_parent" />
android:layout_height="match_parent"
android:entries="@{vm.locations}"
android:onItemSelected="@{vm.selectLocation}"/>
</LinearLayout>
<Button
style="@style/button_style"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_height="55dp"
android:layout_marginTop="12dp"
android:text="提交"
android:onClick="in_submit"
app:layout_constraintTop_toBottomOf="@+id/linearLayout4"
tools:layout_editor_absoluteX="16dp" />
</androidx.constraintlayout.widget.ConstraintLayout>

@ -2,29 +2,55 @@
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="index"
type="String" />
<variable
name="epc"
type="String" />
</data>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="35dp"
android:layout_marginTop="5dp"
android:background="@color/bg1">
android:layout_height="44dp"
android:layout_marginTop="2dp"
android:background="#DEE3E6"
android:orientation="horizontal">
<TextView
android:layout_width="100dp"
android:id="@+id/item_index"
style="@style/item_text_style"
android:layout_width="40dp"
android:layout_height="match_parent"
android:text="1"
style="@style/item_style"/>
android:text='@{index}' />
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="@color/white" />
<TextView
style="@style/item_text_style"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="TextView"
style="@style/item_style"/>
android:layout_weight="1"
android:text="@{epc}" />
<View
android:layout_width="2dp"
android:layout_height="match_parent"
android:background="@color/white" />
<TextView
android:id="@+id/item_buttom"
style="@style/item_text_style"
android:layout_width="63dp"
android:layout_height="match_parent"
android:text="删除"
android:textColor="#E71717" />
</LinearLayout>
</layout>

Binary file not shown.

@ -6,7 +6,11 @@
</style>
<style name="Theme.Beijingdaxing" parent="Base.Theme.Beijingdaxing" />
<style name="item_text_style">
<item name="android:textColor">#666666</item>
<item name="android:gravity">center</item>
<item name="android:textSize">17sp</item>
</style>
<style name="title_text">
<item name="android:background">@color/blue</item>
<item name="android:textColor">@color/white</item>

Loading…
Cancel
Save