Appcelerator:将特定视图的屏幕截图共享为文件导致权限被拒绝消息
Appcelerator: Share Screenshot of a specific view as a File cause Permission denied message
TargetSDK 23,Titanium SDK 5.4.0
设置的权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我通过将视图写入文件来截取视图。这行得通,因为我可以将此文件添加到图像视图并查看图像。
var blob = masterView.views[currentSavedPage].toImage();
var file = Titanium.Filesystem.getFile(Titanium.Filesystem.externalStorageDirectory, "myNewImage.jpg");
file.write(blob);
当我尝试与附加文本共享图片时,其他应用程序(Facebook、Whatsapp 等)无法访问该图片。
intent = Ti.Android.createIntent({
action : Ti.Android.ACTION_SEND,
type : "image/jpeg"
});
intent.putExtra(Ti.Android.EXTRA_TEXT, text);
intent.putExtra(Ti.Android.EXTRA_SUBJECT, subject);
intent.putExtraUri(Ti.Android.EXTRA_STREAM, file.nativePath);
share = Ti.Android.createIntentChooser(intent, 'Bild teilen');
我只得到一个权限被拒绝的错误,不知道如何解决这个问题。这适用于较低的 SDK 版本。
fb4a.RequestLoggingListener: java.io.FileNotFoundException: /data/user/0/de.myapp.id/app_appdata/myNewImage.jpg: open failed: EACCES (Permission denied)
ExifInterface: java.io.FileNotFoundException: /data/user/0/de.myapp.id/app_appdata/myNewImage.jpg: open failed: EACCES (Permission denied)
BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /data/user/0/de.myapp.id/app_appdata/myNewImage.jpg: open failed: EACCES (Permission denied)
解决方案:
if (!Ti.Filesystem.hasStoragePermissions()) {
Ti.Filesystem.requestStoragePermissions(function(result) {
if (result.success) {
openShareIntent();
} else {
alert('Permissions denied.');
}
});
} else {
openShareIntent();
}
如果还没有:
尝试转到您的设置->应用程序->您的应用程序;
然后单击权限并授权访问存储。
但您应该直接从应用程序中请求许可。
官方文档的例子很简单:https://developer.android.com/training/permissions/requesting.html
您需要为 Android 6.0 及更高版本实施运行时权限。因为它没有权限,即使在清单或 tiapp.xml 中定义。提供运行时权限,它不应该给权限错误。
TargetSDK 23,Titanium SDK 5.4.0
设置的权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
我通过将视图写入文件来截取视图。这行得通,因为我可以将此文件添加到图像视图并查看图像。
var blob = masterView.views[currentSavedPage].toImage();
var file = Titanium.Filesystem.getFile(Titanium.Filesystem.externalStorageDirectory, "myNewImage.jpg");
file.write(blob);
当我尝试与附加文本共享图片时,其他应用程序(Facebook、Whatsapp 等)无法访问该图片。
intent = Ti.Android.createIntent({
action : Ti.Android.ACTION_SEND,
type : "image/jpeg"
});
intent.putExtra(Ti.Android.EXTRA_TEXT, text);
intent.putExtra(Ti.Android.EXTRA_SUBJECT, subject);
intent.putExtraUri(Ti.Android.EXTRA_STREAM, file.nativePath);
share = Ti.Android.createIntentChooser(intent, 'Bild teilen');
我只得到一个权限被拒绝的错误,不知道如何解决这个问题。这适用于较低的 SDK 版本。
fb4a.RequestLoggingListener: java.io.FileNotFoundException: /data/user/0/de.myapp.id/app_appdata/myNewImage.jpg: open failed: EACCES (Permission denied)
ExifInterface: java.io.FileNotFoundException: /data/user/0/de.myapp.id/app_appdata/myNewImage.jpg: open failed: EACCES (Permission denied)
BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /data/user/0/de.myapp.id/app_appdata/myNewImage.jpg: open failed: EACCES (Permission denied)
解决方案:
if (!Ti.Filesystem.hasStoragePermissions()) {
Ti.Filesystem.requestStoragePermissions(function(result) {
if (result.success) {
openShareIntent();
} else {
alert('Permissions denied.');
}
});
} else {
openShareIntent();
}
如果还没有:
尝试转到您的设置->应用程序->您的应用程序; 然后单击权限并授权访问存储。
但您应该直接从应用程序中请求许可。 官方文档的例子很简单:https://developer.android.com/training/permissions/requesting.html
您需要为 Android 6.0 及更高版本实施运行时权限。因为它没有权限,即使在清单或 tiapp.xml 中定义。提供运行时权限,它不应该给权限错误。