Android文件选择SAF

1、权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <!-- 安卓10,获取MediaProjection需要在一个前台服务中进行,不给权限则无法进行镜像 -->
<!-- 文件传输 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

2、打开

private void openSAF() {
    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT)
            .addCategory(Intent.CATEGORY_OPENABLE)
            .setType("*/*")
            .putExtra(Intent.EXTRA_ALLOW_MULTIPLE, false);
    if ( android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N){
        intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION |
                Intent.FLAG_GRANT_WRITE_URI_PERMISSION);//添加这一句表示对目标应用临时授权该Uri所代表的文件
    }
    startActivityForResult(intent, RESULT_CODE);
}

3、返回读取文件

ContentResolver resolver = context.getContentResolver();
resolver.takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
cursor = resolver.query(uri, null, null, null, null);

Android webview打开网址异常

某些网站在低版本Android设备上使用异常,处理方式:setAgentSetting属性,当作电脑网页打开。

wv_miniweb.getSettings().setUserAgentString(“Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36”);

PageAdapter

@Override
public int getItemPosition(@NonNull @NotNull Object object) {
    return POSITION_NONE;
}//设置为NONE可以解决数据内容更新了,页面不刷新问题

@Override
public void destroyItem(@NonNull @NotNull ViewGroup container, int position, @NonNull @NotNull Object object) {
    container.removeView((View) object);
}//不加可能会造成pageview左右切换奔溃问题

文件流

int index = -1;
while ((index = inputStream.read(bytes))!=-1&&uploading){
    out.write(bytes,0,index);//用这个
//out.write(bytes);//不要用这个
}

Android应用是否安装判断

另外manifest里面需要添加
<queries>
    <package android:name="com.edutech.liveapp"/>
</queries>
private boolean isAppInstalled(Context context, String packagename)
 {
 PackageInfo packageInfo;
 try {
 packageInfo = context.getPackageManager().getPackageInfo(packagename, 0);
 }catch (PackageManager.NameNotFoundException e) {
 packageInfo = null;
 e.printStackTrace();
// Toast.makeText(this,packagename+":"+e.getMessage(),Toast.LENGTH_LONG).show();
 }
 if(packageInfo ==null){
 //System.out.println("没有安装");
 return false;
 }else{
 //System.out.println("已经安装");
 return true;
 }
 }

Android WebView内跳转链接

mWebView.setWebChromeClient(new WebChromeClient(){
@Override
public boolean onCreateWindow(WebView webView, boolean b, boolean b1, Message message) {
Log.e(“webview”,”onCreateWindow:”+b+”,”+b1);
Log.e(“webview”,”onCreateWindow:”+webView.getUrl());
WebView.WebViewTransport transport = (WebView.WebViewTransport) message.obj;
transport.setWebView(mWebView); //此webview可以是一般新创建的
message.sendToTarget();
return false;
}
});

Hilt 使用

配置:
1、应用build.gradle目录下
dependencies {
classpath “com.android.tools.build:gradle:4.2.2”
classpath “org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version”
classpath “com.google.dagger:hilt-android-gradle-plugin:$hilt_version”
}
2、app的build.gradle下
plugins {
id ‘com.android.application’
id ‘kotlin-android’
id ‘kotlin-kapt’
id ‘dagger.hilt.android.plugin’
}
dependencies下增加

implementation “com.google.dagger:hilt-android:$hilt_version”
kapt “com.google.dagger:hilt-android-compiler:$hilt_version”

异常处理:
检查APP下gradle是否设置
defaultConfig {
applicationId “com.edutech.kotlinappexample”
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName “1.0”
javaCompileOptions{
annotationProcessorOptions{
arguments += [
“room.schemaLocation” : “$projectDir/schemas”.toString(),
“room.incremental” : “true”,
“room.expandProjection”: “true”]
}
}
testInstrumentationRunner “androidx.test.runner.AndroidJUnitRunner”
}
这个arguments要设置为 +=

Mac AndroidStudio 报connectrefused错误

首先看下Gradle Scripts里面的 gradle.properties是否有设置代理,有的话删除,然后再尝试,如果不行请按下面步骤
1、检查gradle.properties看下该文件下是否有设置代理;
2、preferences-》Appearance & Behavior->System Settings ->Http Proxy看下是否设置了代理,将配置的代理删掉;
3、网络高级选项,看下是否有代理,有的话关闭;
最后删掉.gradle文件,关闭AndroidStudio,重启AndroidStudio