我开发了Instant App,我想用相机拍照。如果我启动已安装的应用程序,一切正常。但是使用Instant App,我收到以下错误:
java.lang.SecurityException: Not allowed to start activity Intent { act=android.media.action.IMAGE_CAPTURE launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 }
这是我的代码:
AndroidManifest.xml中
<uses-permission android:name="android.permission.CAMERA" />
活动:
private static int CAMERA_REQUEST = 1234;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_goodbye);
findViewById(R.id.mainButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startCamera();
}
});
}
private void startCamera() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
} else {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_REQUEST);
}
} else {
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_REQUEST);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
startCamera();
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == CAMERA_REQUEST) {
Bitmap bmp = (Bitmap)data.getExtras().get("data");
((ImageView)findViewById(R.id.mainImageView)).setImageBitmap(bmp);
}
}
我使用Android 7.0在设备(samsung)上开发。我检查了可用的权限,相机是这就是为什么它应该工作。 (https://developer.android.com/topic/instant-apps/faqs.html#available-permissions)先谢谢。
我担心问题不是来自许可,而是来自你发起活动的方式。
实际上,Instant Apps无法使用显式意图启动活动,除非该特定意图已用于即时应用程序。
编辑:对不起我之前告诉过你,你试图发表一个明确的意图。实际上,新的Intent(MediaStore.ACTION_IMAGE_CAPTURE)是隐含的。因此,我不明白为什么你有安全例外。你使用最新的金丝雀4版吗?
对于显式意图和隐式意图之间的区别:
Intent intent = new Intent(ACTION_VIEW,Uri.parse("http://www.google.com");
我不认为通过MediaStore.ACTION_IMAGE_CAPTURE
意图拍摄照片不幸的是会在当下工作。即使活动可以启动,它也需要对外部存储的写访问才能实际发回完整的图像,而Instant Apps无法使用外部存储(请参阅restrictions)。如果捕获意图可以写入内部存储(我不确定),FileProvider
目前也不支持Instant Apps。
虽然支持android.permission.CAMERA
权限,但你只需要使用camera2 APIs。有一个代码示例,你可以尝试here。
参考Google issue tracker,修复将是android 8.1 Oreo的一部分。不幸的是,不可能通过GMS修复,但是我们正在向我们的合作伙伴发送补丁修补程序,因此他们可以采用修复程序,即使它们没有建立8.1基础。
如果任何问题仍然存在,请在Google issue tracker报告,他们将重新开放审查。