即时应用相机意图

问题描述 投票:5回答:3

我开发了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)先谢谢。

android android-camera android-permissions android-instant-apps
3个回答
2
投票

我担心问题不是来自许可,而是来自你发起活动的方式。

实际上,Instant Apps无法使用显式意图启动活动,除非该特定意图已用于即时应用程序。

编辑:对不起我之前告诉过你,你试图发表一个明确的意图。实际上,新的Intent(MediaStore.ACTION_IMAGE_CAPTURE)是隐含的。因此,我不明白为什么你有安全例外。你使用最新的金丝雀4版吗?

对于显式意图和隐式意图之间的区别:

  • 显式意图专门针对另一个应用或组件
  • 隐式意图让系统选择应该处理意图的应用程序。即Intent intent = new Intent(ACTION_VIEW,Uri.parse("http://www.google.com");

2
投票

我不认为通过MediaStore.ACTION_IMAGE_CAPTURE意图拍摄照片不幸的是会在当下工作。即使活动可以启动,它也需要对外部存储的写访问才能实际发回完整的图像,而Instant Apps无法使用外部存储(请参阅restrictions)。如果捕获意图可以写入内部存储(我不确定),FileProvider目前也不支持Instant Apps。

虽然支持android.permission.CAMERA权限,但你只需要使用camera2 APIs。有一个代码示例,你可以尝试here


0
投票

参考Google issue tracker,修复将是android 8.1 Oreo的一部分。不幸的是,不可能通过GMS修复,但是我们正在向我们的合作伙伴发送补丁修补程序,因此他们可以采用修复程序,即使它们没有建立8.1基础。

如果任何问题仍然存在,请在Google issue tracker报告,他们将重新开放审查。

© www.soinside.com 2019 - 2024. All rights reserved.