implementation 'com.github.GrenderG:Toasty:1.5.0'
//需要替换okhttp3版本,以去除kotlin库
implementation('com.thegrizzlylabs.sardine-android:sardine-android:0.5'){
exclude group: 'com.squareup.okhttp3'
}
implementation 'com.squareup.okhttp3:okhttp:3.8.0'
使用时封装的上传下载二进制数据的功能
package xxxxx;
import android.content.Context;
import android.text.TextUtils;
import com.thegrizzlylabs.sardineandroid.Sardine;
import com.thegrizzlylabs.sardineandroid.impl.OkHttpSardine;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by ASUS on 2020/11/3.
*/
public class SyncManager {
public static final String TAG = "BackupManager";
public static final String BEACON_SYNC_DIR = "BeaconSync/";
public static final String DEF_SERVER = "https://dav.jianguoyun.com/dav/";
public static final String DEF_FILE_NAME = "RAW.bin";
//上传到webDev
public static boolean upload(Context context, SyncWebDavInfo syncWebDavInfo,byte[] data) {
//init webDev
Sardine sardine = new OkHttpSardine();
sardine.setCredentials(syncWebDavInfo.username, syncWebDavInfo.password);
if(TextUtils.isEmpty(syncWebDavInfo.server)){
syncWebDavInfo.server=DEF_SERVER;
}
if(TextUtils.isEmpty(syncWebDavInfo.filename)){
syncWebDavInfo.filename=DEF_FILE_NAME;
}
//upload data
try {
if (!sardine.exists(syncWebDavInfo.server + BEACON_SYNC_DIR)) {
sardine.createDirectory(syncWebDavInfo.server + BEACON_SYNC_DIR);
}
sardine.put(syncWebDavInfo.server + BEACON_SYNC_DIR + syncWebDavInfo.filename,data);
return true;
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
//从webdav下载
public static byte[] download(Context context,SyncWebDavInfo syncWebDavInfo) {
//init webDev
Sardine sardine = new OkHttpSardine();
sardine.setCredentials(syncWebDavInfo.username, syncWebDavInfo.password);
if(TextUtils.isEmpty(syncWebDavInfo.server)){
syncWebDavInfo.server=DEF_SERVER;
}
if(TextUtils.isEmpty(syncWebDavInfo.filename)){
syncWebDavInfo.filename=DEF_FILE_NAME;
}
try {
if (!sardine.exists(syncWebDavInfo.server + BEACON_SYNC_DIR + syncWebDavInfo.filename)) return null;
InputStream inputStream = sardine.get(syncWebDavInfo.server + BEACON_SYNC_DIR + syncWebDavInfo.filename);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
byte[] buf = new byte[1024];
int n = 0;
while ((n = inputStream.read(buf)) > 0) {
outputStream.write(buf, 0, n);
outputStream.flush();
}
outputStream.close();
inputStream.close();
return outputStream.toByteArray();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
SyncWebDavInfo.java
package xxxxx;
/**
* Created by ASUS on 2020/11/4.
*/
public class SyncWebDavInfo {
public String server;
public String username;
public String password;
public String filename;
public SyncWebDavInfo() {
}
public SyncWebDavInfo(String server, String username, String password, String fileName) {
this.server = server;
this.username = username;
this.password = password;
this.filename = fileName;
}
}
implementation 'com.zhy:base-rvadapter:3.0.3'
基于该代码封装了一个helper类,实现一个简单的列表单选对话框功能
package xxxxx;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.view.Gravity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.zhy.adapter.recyclerview.CommonAdapter;
import com.zhy.adapter.recyclerview.MultiItemTypeAdapter;
import com.zhy.adapter.recyclerview.base.ViewHolder;
import java.lang.ref.WeakReference;
import java.util.List;
public class ListViewHelper<T> {
public static final String TAG = "ListViewHelper";
private WeakReference<Activity> activityWeakReference;
private RecyclerView recyclerView;
private CommonAdapter<T> commonAdapter;
private AlertDialog alertDialog;
private LinearLayout root;
private List<T> lists;
private Callback<T> callback;
public interface Callback<T> {
void onValue(T item);
}
ListViewHelper(Activity activity,String title) {
activityWeakReference = new WeakReference<>(activity);
recyclerView = new RecyclerView(activity);
recyclerView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
recyclerView.setLayoutManager(new LinearLayoutManager(activity));
root=new LinearLayout(activity);
root.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT));
root.setGravity(Gravity.CENTER);
root.setOrientation(LinearLayout.VERTICAL);
root.addView(recyclerView);
alertDialog=new AlertDialog.Builder(activity).setTitle(title).setView(root).create();
}
public ListViewHelper watch(List<T> list) {
this.lists=list;
commonAdapter = new CommonAdapter<T>(activityWeakReference.get(), R.layout.list_item, list) {
@Override
protected void convert(ViewHolder holder, T item, int position) {
TextView title=holder.getView(R.id.title);
title.setText(getTitle(item));
title.setOnClickListener(v -> {
if(callback!=null)callback.onValue(item);
alertDialog.dismiss();
});
}
};
recyclerView.setAdapter(commonAdapter);
return this;
}
public ListViewHelper callback(Callback<T> callback) {
this.callback=callback;
return this;
}
public void show() {
alertDialog.show();
}
public String getTitle(T item){
return item.toString();
}
}
list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:gravity="center"
android:layout_height="wrap_content">
<TextView
android:theme="@style/Widget.AppCompat.Button"
android:gravity="center"
android:text="Test"
android:padding="8dp"
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
调用例子
ListViewHelper listViewHelper= new ListViewHelper<BluetoothBean>(getActivity(),"选择设备"){
@SuppressLint("StaticFieldLeak")
@Override
public String getTitle(BluetoothBean item) {
if(TextUtils.isEmpty(item.name)){
return item.mac;
}
return String.format("%s(%s)",item.mac,item.name);
}
};
listViewHelper.watch(beans).callback((ListViewHelper.Callback<BluetoothBean>) item -> {
if(getPreferenceManager().getSharedPreferences().edit().putString(prefHexUpload,ByteUtil.toHexString(item.raw)).commit()){
ToastHelper.success("已采集选择的设备数据");
}
}).show();
implementation 'com.github.getActivity:XXPermissions:12.0'
XXPermissions.with(this).permission(Permission.ACCESS_FINE_LOCATION)
.permission(Permission.ACCESS_BACKGROUND_LOCATION)
.request(new OnPermissionCallback() {
@Override
public void onGranted(List<String> permissions, boolean all) {
if(all){
init();
}else {
ToastHelper.error("获取部分权限成功,但部分权限未正常授予");
}
}
@Override
public void onDenied(List<String> permissions, boolean never) {
if (never) {
ToastHelper.error("被永久拒绝授权,请手动授予位置权限权限");
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(SplashActivity.this, permissions);
} else {
ToastHelper.error("获取位置权限失败");
}
}
});
implementation 'org.altbeacon:android-beacon-library:2.19'
声明:转载请注明出处,原文地址:shlu's note