shlu's note

工具库

Toast

implementation 'com.github.GrenderG:Toasty:1.5.0'

Webdav

    //需要替换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;
    }


}

ListView

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();

permission

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("获取位置权限失败");
                        }
                    }
                });

Bluetooth

implementation 'org.altbeacon:android-beacon-library:2.19'

声明:转载请注明出处,原文地址:shlu's note