Instant Apps 相机意图

Posted

技术标签:

【中文标题】Instant Apps 相机意图【英文标题】:Instant Apps Camera Intent 【发布时间】:2017-12-03 10:12:09 【问题描述】:

我开发了一款我想用相机拍照的 Instant App。 如果我启动 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) 提前致谢。

【问题讨论】:

【参考方案1】:

我担心问题不在于权限,而在于您启动活动的方式。

Instant Apps 实际上无法启动具有显式 Intent 的 Activity,除非该特定 Intent 已对 Instant App 可用。

编辑:对不起,我之前告诉过你,你正试图启动一个明确的意图。实际上 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【参考方案2】:

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

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

【讨论】:

这是一个外部可见的错误:issuetracker.google.com/issues/66942980【参考方案3】:

参考Google issue tracker,该修复将成为android 8.1 Oreo 的一部分。很遗憾,无法通过 GMS 进行修复,但我们会向合作伙伴发送修复补丁,以便他们可以采用修复,即使他们不是基于 8.1 基础

如果任何问题仍然存在,请通过Google issue tracker 报告,他们将重新打开进行检查。

【讨论】:

以上是关于Instant Apps 相机意图的主要内容,如果未能解决你的问题,请参考以下文章

Android Instant Apps 是不是像宣传的那样工作?

Google 的 “小程序”来了,Android Instant Apps 开放内测

现在是不是必须使用 Google Play Signing for Instant Apps?

为啥我无法在 Android Instant App 中访问相机?

instant的近义词辨析

Unity渲染工作原理--和instantOC插(减少CPU 和 GPU的工作量)