5

我开发了一个即时应用程序,我想用相机拍照。如果我启动Installed 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 的设备(三星)上开发。我检查了可用的权限,相机就是它应该工作的原因。(https://developer.android.com/topic/instant-apps/faqs.html#available-permissions)提前致谢。

4

3 回答 3

2

我担心问题不是来自许可,而是来自您启动活动的方式。

Instant Apps 实际上无法启动具有明确意图的活动,除非该特定意图已可用于即时应用程序。

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

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

  • 明确的意图专门针对另一个应用程序或组件

  • 隐式意图让系统选择应该处理该意图的应用程序。IEIntent intent = new Intent(ACTION_VIEW,Uri.parse("http://www.google.com");

于 2017-06-29T17:47:39.947 回答
2

不幸的是,我认为MediaStore.ACTION_IMAGE_CAPTURE目前通过意图拍摄照片不会起作用。即使活动可以启动,它也需要对外部存储的写访问权才能真正发回完整的图像,并且即时应用程序无法使用外部存储(请参阅限制)。FileProvider目前即时应用程序也不支持,以防捕获意图可以写入内部存储(我不确定)。

虽然支持权限android.permission.CAMERA,但您只需要使用camera2 APIs您可以在此处试用代码示例。

于 2017-06-30T14:37:09.043 回答
0

参考谷歌问题跟踪器,修复将是android 8.1 Oreo的一部分。不幸的是,无法通过 GMS 进行修复,但是我们正在向我们的合作伙伴发送修复补丁,因此即使他们不是基于8.1 基础构建的,他们也可以采用该修复。

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

于 2017-12-17T07:51:52.220 回答