https://androidappsapk.co/search/googleplay/
https://www.apkmonk.com/download-app/
Android 键盘输入表情和颜文字禁用
public class EmojiExcludeFilter implements InputFilter { @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { boolean hasManyType = false; int sourcelen = 0; for (int i = start; i < end; i++) { int type = Character.getType(source.charAt(i)); Log.e("InputFilter","text:"+source.toString()+","+type); if (type == Character.SURROGATE || type == Character.OTHER_SYMBOL) { Log.e("InputFilter","text 133"); return ""; } sourcelen ++; if(type!=Character.UPPERCASE_LETTER&&type!=Character.BYTES&&type!=Character.DECIMAL_DIGIT_NUMBER&&type!=Character.OTHER_LETTER&&type!=Character.SPACE_SEPARATOR){ hasManyType = true; } } if("◽".equals(source.toString())||"◼".equals(source.toString())||"◻".equals(source.toString())){ Log.e("InputFilter","text:143"); return ""; } if("〰".equals(source.toString())||"〽".equals(source.toString())||"⤵".equals(source.toString())){ Log.e("InputFilter","text:147"); return ""; } if("⤴".equals(source.toString())||"◾".equals(source.toString())||"⤵".equals(source.toString())){ Log.e("InputFilter","text:151"); return ""; } if(hasManyType&&sourcelen>1){//处理 Log.e("InputFilter","text:155:"+source.toString()); return ""; } Log.e("InputFilter","text:"+source.toString()+","+source.toString()); return null; } }
表情的type是单一数值可以直接筛选;
颜文字的type是有多种类型拼接起来的:常用字符(type:2),数值(type:9),中文(5),空格以及其他特殊字符组成,并且颜文字的长度肯定大于1。如果字符长度大于1并且包含特殊字符,可以判定该次输入为颜文字。
Android 系统录制屏幕
如果依赖版本是Android Q之后的版本,系统录制屏幕的方法需要有所变动:
1、需要将onActivityResult中返回的resultcode和data传给service,然后在service中获取MediaProjcection
MediaProjection mediaProjection = ScreenRecorderCtrl.getInstance().getProjectionManager().getMediaProjection(resultcode, data)
2、Mainfest对应service中添加如下属性
android:enabled="true" android:foregroundServiceType="mediaProjection"
3、Service中onStartCommand中需要设置通知,该方法要在MediaProjection初始化之前
/** * 添加一个状态栏通知 */ private void addNotification(){ NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); if(Build.VERSION.SDK_INT >= 26) { //当sdk版本大于26 String id = "screenrecord"; String description = "143"; int importance = NotificationManager.IMPORTANCE_HIGH; NotificationChannel channel = new NotificationChannel(id, description, importance); manager.createNotificationChannel(channel); Notification notification = new Notification.Builder(this, id) .setCategory(Notification.CATEGORY_MESSAGE) .setSmallIcon(R.drawable.recoding) .setContentTitle("录屏服务 ") .setContentText("进行中") .setAutoCancel(false) .build(); startForeground(1,notification); } else { Notification notification = new Notification.Builder(this) .setContentTitle("录屏服务 ") .setContentText("进行中") .setSmallIcon(R.drawable.recoding) .build(); startForeground(1, notification); } }
4、Service启动的时候
Intent service = new Intent(this, ScreenRecorderService.class); service.putExtra("code", resultcode);//onactivityresult返回值 service.putExtra("data", data);//onactivityresult 返回值 if (android.os.Build.VERSION.SDK_INT <=26) { startService(service); }else { startForegroundService(service); }
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中嵌套的时候要注意。