有没有办法在Android 11上不使用SAF将图像保存到U盘?

有没有办法在Android 11上不使用SAF将图像保存到U盘?,android,usb,mediastore,android-11,storage-access-framework,Android,Usb,Mediastore,Android 11,Storage Access Framework,我想将相机从我的应用程序中拍摄的图像直接保存到插入手机的U盘上。有没有一种不要求用户从SAF中选择目录的方法?我想使用范围存储,因为我的目标是Android 11及以后的版本 没有sd卡连接到设备 我可以用这个代码在安卓10上的U盘上存储文件,但在安卓11上不能 //我通过参数传递从相机拍摄的图像 私有void legacyToUsb(文件映像){ 文件[]externalStorageVolumes=ContextCompat.getExternalFilesDirs(getApplicati

我想将相机从我的应用程序中拍摄的图像直接保存到插入手机的U盘上。有没有一种不要求用户从SAF中选择目录的方法?我想使用范围存储,因为我的目标是Android 11及以后的版本

没有sd卡连接到设备

我可以用这个代码在安卓10上的U盘上存储文件,但在安卓11上不能
//我通过参数传递从相机拍摄的图像
私有void legacyToUsb(文件映像){
文件[]externalStorageVolumes=ContextCompat.getExternalFilesDirs(getApplicationContext(),null);
字符串路径=null;
对于(文件externalDir:externalStorageVolumes){
Log.d(标签“find dir at:”+externalDir);
path=externalDir.getPath();
}
if(路径==null){
showToast(“未能找到已安装的设备”);
返回;
}
字符串文件名=mDateFormat.format(System.currentTimeMillis())+“.jpg”;
File destFile=新文件(路径、文件名);
showtoos(“将数据保存到”+destFile.getPath());
如果(destFile==null)
showToast(“打开文件失败”);
FileOutputOS;
String msg=“已成功保存到”+destFile.getPath();
试一试{
字节[]imageData=getBytesFromFile(图像);
os=新文件输出流(destFile);
写入(图像数据);
}捕获(IOE异常){
e、 printStackTrace();
msg=“保存文件失败:”+e.getMessage();
}
烤面包片(味精);
}
但是,在Android 11上,这不起作用(我无法在U盘中创建文件),因为
getExternalFilesDirs()
没有给我usb otg的路径

ContextCompat.getExternalFilesDirs()
返回:

Android 10

Found dir at : /storage/emulated/10/Android/data/com.example.MyApp/files
Found dir at : /storage/4406-15E5/Android/data/com.example.MyApp/files //I'm using this one
Android 11

Found dir at : /storage/emulated/0/Android/data/com.example.MyApp/files 
据我所知,作用域存储消除了通过这些功能访问可移动存储的可能性。所以我试着换一种方式

private void scopedToUsb(文件映像){
ContentResolver解析器=getContentResolver();
字符串文件名=mDateFormat.format(System.currentTimeMillis());
ContentValues fileDetails=新ContentValues();
fileDetails.put(MediaStore.Images.Media.DISPLAY_名称、文件名);
fileDetails.put(MediaStore.Images.Media.MIME_TYPE,“image/jpeg”);
fileDetails.put(MediaStore.Images.Media.RELATIVE\u路径、Environment.DIRECTORY\u图片);
fileDetails.put(MediaStore.Images.Media.IS_PENDING,1);
设置volumeNames=MediaStore.getExternalVolumeNames(getApplicationContext());
字符串storageVolume=null;
//获取此处找到的第一个卷,它返回标识U盘的十六进制数
//就我而言,4406-15e5
for(字符串volumeName:volumeName){
storageVolume=volumeName;
Log.d(标记“找到的卷名:”+volumeName);
打破
}
//我在这里尝试了MediaStore.VOLUME\u EXTERNAL和MediaStore.VOLUME\u EXTERNAL\u PRIMARY
//它们都指向不在U盘中的同一目录
Uri集合=MediaStore.Images.Media.getContentUri(storageVolume);
Uri imageUri=resolver.insert(集合、文件详细信息);
如果(imageUri==null){
showToast(“未能将图像行插入ContentResolver”);
返回;
}
d(标记“插入,将创建输出流”);
OutputStream out=null;
试一试{
out=解析器.openOutputStream(imageUri);
位图bm=BitmapFactory.decodeFile(image.getAbsolutePath());
bm.compress(Bitmap.CompressFormat.JPEG,100,out);
out.close();
}捕获(IOE异常){
e、 printStackTrace();
showToast(“无法将图片sqve到Usb”);
返回;
}
showToast(“已成功保存到”+collection.getPath());
}
但我在这行收到一个例外

uriimageuri=resolver.insert(集合、文件详细信息);
例外情况

java.lang.IllegalStateException: Failed to create directory: /mnt/media_rw/4406-15E5/Pictures/.pending-1621349186-2021-05-11-16-46-26-671.jpg
        at android.os.Parcel.createExceptionOrNull(Parcel.java:2384)
        at android.os.Parcel.createException(Parcel.java:2360)
        at android.os.Parcel.readException(Parcel.java:2343)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:190)
        at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:142)
        at android.content.ContentProviderProxy.insert(ContentProviderNative.java:549)
        at android.content.ContentResolver.insert(ContentResolver.java:2177)
        at android.content.ContentResolver.insert(ContentResolver.java:2138)
        at com.example.MyApp.MainActivity.scopedToUsb(MainActivity.java:368)
        at com.example.MyApp.MainActivity.saveToUsb(MainActivity.java:294)
        at com.example.MyApp.MainActivity.access$000(MainActivity.java:72)
        at com.example.MyApp.MainActivity$1.onImageSaved(MainActivity.java:273)
        at androidx.camera.core.ImageCapture$2.onImageSaved(ImageCapture.java:844)
        at androidx.camera.core.ImageSaver.lambda$postSuccess$1$ImageSaver(ImageSaver.java:308)
        at androidx.camera.core.-$$Lambda$ImageSaver$29vxg6qyjKwPRXgWrIwgYVInWKE.run(Unknown Source:4)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:923)

可能吗?我错过任何许可了吗?我应该强制使用Storage Access框架吗?谢谢

在Android 11上这不起作用,因为我无法在usb中获取文件
你是什么意思?对不起,我听不懂。在安卓10上,我可以做到这一点,我想问你为什么不能在11上做到这一点。您没有告诉我,当我在Android 11手机上使用我的
legacyToUsb()
函数时,它会将图像存储在
/storage/simulated/0/Android/data/com.example.MyApp/files
中,该位置与U盘不对应。我认为这个问题不清楚,所以我对这个短语做了一些修改。谢谢您仍然没有解释
,但是,在Android 11上,这不起作用。所以这句话上面的代码在Android 11上不起作用。好啊但为什么不呢?你还是没告诉我。现在我第三次问:Wy,这段代码在Android 11上不起作用吗?为什么它能在安卓10上工作?
我无法在usb中获取文件
一句非常不清楚的话。你的意思是:
我无法在U盘上创建文件。
?请讲清楚。