uni-app Android请求对所有文件的访问权限

发布于 1周前 作者 sinazl 来自 Uni-App

uni-app Android请求对所有文件的访问权限

清单文件添加文件读写权限

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />  
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />
class FileUtils {  

  static checkPermission() {  
    const Build = plus.android.importClass('android.os.Build');  
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){  
      const Environment =  plus.android.importClass("android.os.Environment");  
      return Environment.isExternalStorageManager();  
    }  
    return true  
  }  

  static applyPermission(fn) {  
    const Build = plus.android.importClass('android.os.Build');  
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R){  
      var Intent = plus.android.importClass("android.content.Intent");  
      var Settings = plus.android.importClass("android.provider.Settings");  
      var Uri = plus.android.importClass("android.net.Uri");  
      var mainActivity = plus.android.runtimeMainActivity();  

      var intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);  
      var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);  
      intent.setData(uri);  
      // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
      mainActivity.startActivity(intent);   
    }  
    fn({state:'ok'})  
  }  
}
if(FileUtils.checkPermission()==false){  
  that.showLoading("请稍等")  
  FileUtils.applyPermission(res => {  
    uni.hideLoading()  
  })  
  return  
}

图片


1 回复

在开发uni-app应用时,如果需要请求Android设备对所有文件的访问权限,通常需要结合Android原生代码来实现。由于uni-app是基于Vue.js的多端开发框架,它本身并不直接提供访问文件系统的API,特别是针对Android平台的高级权限管理。因此,你需要编写自定义的Android插件来实现这一功能。

以下是一个简化的步骤和代码示例,展示如何通过自定义插件在uni-app中实现请求所有文件访问权限的功能。

步骤1:创建Android原生插件

首先,在你的uni-app项目中创建一个自定义的Android原生插件。

  1. native-plugins目录下创建一个新的插件目录,比如FileAccessPlugin
  2. 在该目录下创建FileAccessPlugin.java文件,并编写请求权限的代码。
import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import io.dcloud.feature.uniapp.bridge.UniJSCallback;
import io.dcloud.feature.uniapp.common.UniModule;

public class FileAccessPlugin extends UniModule {

    private static final int REQUEST_CODE_PERMISSION = 100;

    public void requestAllFilesPermission(UniJSCallback callback) {
        if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
            ContextCompat.checkSelfPermission(mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
            
            ActivityCompat.requestPermissions((Activity) mContext, new String[]{
                Manifest.permission.READ_EXTERNAL_STORAGE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
            }, REQUEST_CODE_PERMISSION);
            callback.invoke("Permission request sent.");
        } else {
            callback.invoke("Already have permissions.");
        }
    }

    // Handle permission result (optional, for completeness)
    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (requestCode == REQUEST_CODE_PERMISSION) {
            // Handle permission result logic here
        }
    }
}

步骤2:在uni-app中调用插件

在你的uni-app的Vue组件中,使用plus.bridge.exec方法来调用这个原生插件。

export default {
    methods: {
        requestFilePermission() {
            plus.bridge.exec('FileAccessPlugin', 'requestAllFilesPermission', [], (res) => {
                console.log(res);
            });
        }
    },
    mounted() {
        this.requestFilePermission();
    }
}

注意

  1. 上述代码仅为示例,实际项目中可能需要更复杂的权限处理逻辑。
  2. 从Android 10(API级别29)开始,访问外部存储的方式发生了重大变化,建议使用Scoped Storage或MediaStore API来处理文件访问。
  3. 在实际部署时,确保在AndroidManifest.xml中声明必要的权限。

通过这种方式,你可以在uni-app中实现请求Android设备对所有文件的访问权限。

回到顶部