Android Wi-Fi连接

1、Android Q之后Wi-Fi连接要调用,如果用之前的方法无法连接对应的网络

@RequiresApi(api = Build.VERSION_CODES.Q)
    public void wifiConnectAndroidQ(String ssid, String password)
    {

            NetworkSpecifier specifier =
                    new WifiNetworkSpecifier.Builder()
                            .setSsidPattern(new PatternMatcher(ssid, PatternMatcher.PATTERN_PREFIX))
                            .setWpa2Passphrase(password)
                            .build();

            NetworkRequest request =
                    new NetworkRequest.Builder()
                            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
                            .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
                            .setNetworkSpecifier(specifier)
                            .build();

            ConnectivityManager connectivityManager = (ConnectivityManager)
                    getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

            ConnectivityManager.NetworkCallback networkCallback = new ConnectivityManager.NetworkCallback() {
                @Override
                public void onAvailable(Network network) {
                    // do success processing here..
//                    Log.e("MainActivity","onavaliable:"+wifiManager.getConnectionInfo().);
                }

                @Override
                public void onUnavailable() {
                    // do failure processing here..
                }
            };
            connectivityManager.requestNetwork(request, networkCallback);
            // Release the request when done.
            // connectivityManager.unregisterNetworkCallback(networkCallback);

    }

2、AndroidQ之后判断网络是否连接

private boolean isWifiEnable() {
    ConnectivityManager cm = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT>=29) {
        if (cm != null) {
            NetworkCapabilities nc = cm.getNetworkCapabilities(cm.getActiveNetwork());
            boolean boo = nc != null && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) && nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
            Log.e("MainActivity","iswifienable:"+boo);
            return boo;
        } else {
            Log.e("MainActivity","iswifienable:"+false);
            return false;
        }
    } else {
        boolean boo = cm != null && cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;
        Log.e("MainActivity","iswifienable:"+boo);
        return boo;
    }
}

3、如果当前连接的Wi-Fi在系统Wi-Fi设置中取消保存,应用能接收到Wi-Fi变动,但是下面方法返回的ssid还是取消保存的Wi-Fi,

wifiInfo.getSSID()

需要再判断下下面是不是-1

wifiInfo.getNetworkId()

4、Android Q之后禁用三方应用打开和关闭Wi-Fi

Android WebView

1、web view黑屏问题:
1)硬件加速改成软件加速;2)setJavascriptEnable;3)webview布局尺寸设置为充满整个屏幕;4)如果是dialog弹窗中显示,则最好设置dialog的尺寸大小(window设置宽高)

2、字体设置问题:setTextZoom(),这个默认是100(原大小),另外在list view中嵌套的时候要注意。

GSON 解析null异常问题

Gson gson = new GsonBuilder().registerTypeHierarchyAdapter(List.class, new JsonDeserializer<List<?>>() {
    @Override
    public List<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
        if (json.isJsonArray()){
            //这里要自己负责解析了
            Gson newGson = new Gson();
            try {
                return newGson.fromJson(json,typeOfT);
            }catch (Exception e){
                return Collections.EMPTY_LIST;//解析异常返回空数组
            }
        }else {
            //和接口类型不符,返回空List
            return Collections.EMPTY_LIST;
        }
    }
}).create();
registerTypeHierarchAdapter注册一个反序列号。上面是list中值是null的问题。
int,string都可以参照上面方式处理,在deserialize中处理json数据。

Mac 共享屏幕

1、通过系统偏好设置-》隔空播放;

2、通过系统偏好设置-》共享-》共享屏幕

共享屏幕时输入的帐号和密码是电脑的用户名和电脑开机密码

 

3、多台苹果设备投屏到Mac/Win 使用:AirServer。

Flutter分析工具

1.view->tool windows里可以选择对应的flutter工具:flutter performances
2.flutter run将程序跑起来,在控制台会有一个网址,将网址拷贝的浏览器上打开,这个是dart分析工具,也可以协助分析和调试,devTool可以根据W、S控制放大缩小,A、D控制左右移动
3.设置debug
debugProfileBuildsEnabled = true;
debugProfilePaintsEnabled = true;
debugPaintLayerBordersEnabled = true;
4.savelayer 和clipPath少用
savelayer在opacity和shadermask中可能调用;
如果需要clip尽量使用:clip.antialians和clip.hardedge
5.控件更新定义一个特定的模块;

Flutter 问题汇总

1、启动页黑屏和启动之后黑屏问题
drawable下可以设置启动页的背景或者颜色;
mainifest下在对应的activity加上:



2.AndroidStudio 打开yaml文件,造成AndroidStudio卡死问题:
检查是否安装了插件:Flutter EnhanceMent Suite,如果安装了,把该插件卸载掉。

Android webview与Javascript

js中调用安卓方法。
mWebView.addJavascriptInterface(new JsInterface(),”EdutechcommWv”);
mWebView.getSettings().setJavaScriptEnabled(true);
public class JsInterface{

public JsInterface() {
}

@JavascriptInterface
public void getPlatformIp(){
mWebView.loadUrl(“javascript:window.API_ROOT = “+ip+”;”);//注入JS,JS的window直接获取数据信息
return;
}

@JavascriptInterface
public String getUserInfo(){
return “userinfo”;//直接返回数据,js获取处理
}
}

Android问题汇总

1.recycleview 只显示第一条数据
处理方法:item的父布局的高度设置为wrap-content
2.类似直播连麦,二个surfaceview播放直播流,需要大小窗口切换主视频,切换过程中会出现某个surfaceview透明显示不出的情况。
处理方法:setZOrderMediaOverlay设置小窗口为true,设置主窗口为false。小窗口布局层级在主窗口之上。
if(mVideoItemStudent!=null&&mVideoItemStudent.getSurfaceView()!=null){
mVideoItemStudent.getSurfaceView().setZOrderMediaOverlay(false);
}
if(mVideoItemTeacher!=null&&mVideoItemTeacher.getSurfaceView()!=null){
mVideoItemTeacher.getSurfaceView().setZOrderMediaOverlay(true);
}//luojie 二个surfaceview播放视频流,如果不只设置Zorder为true,在某些设备上可能会有某个surface会透明显示不出,
3.好的日历插件
implementation ‘com.haibin:calendarview:3.6.9’
4.targetVersion超过28,安卓不允许在根目录创建文件夹;
5.当Wi-Fi不能访问外网时,socket内网连接会有异常,处理办法如下:
private void useWifiNetWork(){
ConnectivityManager connection_manager =
(ConnectivityManager) getApplication().getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkRequest.Builder request = new NetworkRequest.Builder();
request.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
connection_manager.registerNetworkCallback(request.build(), new ConnectivityManager.NetworkCallback() {

@Override
public void onAvailable(Network network) {
ConnectivityManager.setProcessDefaultNetwork(network);
}
});
}
6.socket:通过在service中发心跳包保持连接,但是当手机休眠时socket会无法发送数据,可用的解决办法如下:
可以在oncreate中:
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, “xxx:xxx”);
wl.acquire();
在ondestroy中:
if(wl!=null){
wl.release();
}
acquire和release的次数必须是一致的,否则会有异常。
7.抓取摄像头视频流,然后将视频流数据同步给服务端,可用的方案有:
a.开启摄像头预览,抓取预览的图片数据YUV格式,将图片数据按照需求做下转换,将数据传递给mediacodec编码,将处理好的流数据通过协议发送给服务端。
b.相机将预览画面通过render渲染在GLSurfaceview,mediacodec设置inputsurface,然后去编码,再将处理好的数据通过协议发送给服务端。
8.相机预览模糊:设置previewsize是否设置的太小;相机自动对焦是否设置。