如何在即时应用中保存图片
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="***">
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<application android:allowBackup="true"
android:label="@string/app_name"
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"/>
EasyPermissions.requestPermissions(this, "11", REQUEST_STORAGE_PERMISSION, Manifest.permission.WRITE_EXTERNAL_STORAGE);
java.io.FileNotFoundException:/storage/emulated/0/Android/data/***/files/pic.jpg(Permission denied)
答案 0 :(得分:2)
您无法直接在Instant Apps中访问存储空间。 它们运行在更高级别的安全SandBox上。 您有权访问的唯一权限如下:
BILLING
ACCESS_COARSE_LOCATION
ACCESS_FINE_LOCATION
ACCESS_NETWORK_STATE
CAMERA
INSTANT_APP_FOREGROUND_SERVICE only in Android O.
INTERNET
READ_PHONE_NUMBERS only in Android O.
RECORD_AUDIO
VIBRATE
任何其他权限都需要已安装的应用版本。
这意味着您无法从公共存储中读取或写入。 但是,您可以访问公开内容提供商,这些公开内容提供商会使用即时应用程序,例如联系人拣货员或者是明星。
来源:官方常见问题here
答案 1 :(得分:0)
将此代码应用于相机活动以获取权限
takephoto.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (hasTakePermissions(getApplicationContext(), PERMISSIONS)) {
takePicture();
} else {
ActivityCompat.requestPermissions(HomeActivity.this, PERMISSIONS, PERMISSION_ALL);
}
}
});
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_WRITE_PERMISSION:
if (hasPermissions(getApplicationContext(), PERMISSIONS)) {
takePicture();
} else {
ActivityCompat.requestPermissions(HomeActivity.this, PERMISSIONS, PERMISSION_ALL);
}
}
}
public static boolean hasTakePermissions(Context context, String... permissions) {
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) {
for (String permission : permissions) {
if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
}
return true;
}
答案 2 :(得分:0)
我迟到了,希望能对某人有所帮助
如前所述,WRITE_EXTERNAL_STORAGE具有保护级别:危险,因此您不能使用它。 但是,您可以使用缓存保存图像。
val outDirectory = File(activity?.cacheDir, "image.jpg")
警告:明智地使用它,因为如果有多个图像,将不可避免地遇到OOM。