即时应用相机意图

5
我开发了一个即时应用程序,想要使用相机拍照。如果我启动已安装的应用程序,一切都可以正常运作。但是对于即时应用程序,我会收到以下错误信息:
java.lang.SecurityException: Not allowed to start activity Intent { act=android.media.action.IMAGE_CAPTURE launchParam=MultiScreenLaunchParams { mDisplayId=0 mFlags=0 }

这是我的代码:
AndroidManifest.xml Activity :
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的三星设备进行开发。我检查了可用权限,相机应该可以工作。 (https://developer.android.com/topic/instant-apps/faqs.html#available-permissions) 提前感谢。

3个回答

2
我担心问题不是来自权限,而是来自您启动活动的方式。
实际上,即时应用程序无法使用显式意图启动活动,除非该特定意图已经对即时应用程序可用。
编辑:抱歉之前告诉你正在尝试启动显式意图。实际上,new Intent(MediaStore.ACTION_IMAGE_CAPTURE) 是隐式的。因此,我不明白为什么会出现安全异常。您是否使用最新的canary 4版本?
关于显式意图和隐式意图的区别:
- 显式意图专门针对另一个应用程序或组件。 - 隐式意图让系统选择哪个应用程序应处理意图。例如:Intent intent = new Intent(ACTION_VIEW,Uri.parse("http://www.google.com");

我正在使用 Android Studio 3.0 Canary 4 - Gradle 版本:4.0 - Android 插件版本:3.0.0-alpha4 - Pouicky

2
很遗憾,我不认为通过MediaStore.ACTION_IMAGE_CAPTURE意图捕获照片目前能够正常工作。即使该活动可以启动,它也需要对外部存储的写入访问权限才能实际发送完整的图像,并且外部存储器对即时应用程序是不可用的(请参见限制)。在这种情况下,如果捕获意图可以写入内部存储器,则FileProvider目前也不支持即时应用程序(关于此点我不确定)。
但是,权限android.permission.CAMERA是受支持的,您只需要使用camera2 API。这里有一个您可以尝试的代码示例here

{btsdaf} - AdamK

0

关于Google问题跟踪器,修复将成为Android 8.1 Oreo的一部分。不幸的是,无法通过GMS进行修复,但我们正在向合作伙伴发送修补程序,以便他们可以采用修复,即使他们没有基于8.1版本构建。

如果仍有任何问题,请在Google问题跟踪器上报告,他们将重新开放以进行检查。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接