当前位置: 首页 > 知识库问答 >
问题:

Android通知错误摄像头不可访问

徐飞尘
2023-03-14

在带有通知栏的torch应用程序中,当您在torch打开的情况下最小化应用程序时,如果您尝试单击通知,则表示无法访问相机。

代码是:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Acceder a la cámara.
    if (!initTorch()) {
        return;
    }

    // Encender el flash.
    torch.on();

    // Cargar interfaz gráfica.
    setContentView(R.layout.activity_main);
    Button button = (Button) findViewById(R.id.button_on_off);
    button.setOnClickListener(this);

    // Adquirir el wake lock.
    PowerManager powerManager =
            (PowerManager) getSystemService(POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(
            PowerManager.PARTIAL_WAKE_LOCK, WAKE_LOCK_TAG);
    wakeLock.setReferenceCounted(false);
    if (!wakeLock.isHeld()) {
        wakeLock.acquire();
    }

    // Iniciar el NotifactionManager.
    notificationManager = (NotificationManager)
            getSystemService(NOTIFICATION_SERVICE);

    // Creamos la notificación.
    createNotification();
}

private boolean initTorch() {
    try {
        // Acceder a la cámara.
        torch = new Torch();
    } catch (Exception e) {
        // Mostrar mensaje de error al usuario.
        Toast.makeText(this,
                getResources().getString(R.string.text_error),
                Toast.LENGTH_LONG).show();
        // Salir de la aplicación.
        finish();

        return false;
    }

    return true;
}

private void createNotification() {
    Intent intent = new Intent(this, MainActivity.class);

    PendingIntent pendingIntent = PendingIntent.getActivity(this,
            0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    Notification notification = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(getResources().getString(R.string.app_name))
            .setContentText(getResources().getString(R.string.notification_text))
            .setOngoing(true)
            .setContentIntent(pendingIntent)
            .build();

    notificationManager.notify(NOTIFICATION_ID, notification);
}

共有3个答案

林雅畅
2023-03-14

这是因为你的应用程序的一个实例已经在后台使用了摄像头。这就是为什么在它释放摄像头之前你无法访问它。只需在暂停时释放相机资源。把它放在简历上。它会起作用的。

邰伟彦
2023-03-14

问题是,通知中将调用onCreate()(例如,请参见为什么即使设置了“否创建”标志,PendingEvent触发器仍会onCreate),如果旧的活动仍处于活动状态,则不应尝试创建新火炬()

您可以尝试为活动设置android:launchMode=“singleTask”,但这并不总是有效(请参阅Pending intent always make new activity)。如果是这种情况,您应该开发一种更复杂的机制,例如,通知可能会请求旧活动释放摄像头,然后才会启动新活动。

不过,我担心这种解决办法会导致火炬出现可见的闪烁。

郑俊彦
2023-03-14

一次只能有一个应用程序获取相机。很可能你的意图是创建一个新任务,因此,你的活动有了一个新实例。由于您的前一个实例尚未释放相机(从您的代码中,我只能推断出,因为似乎相机是通过torch.on()获得的,并且从未释放),第二个实例无法获得它。

简而言之,你应该:

  • 调整您的意图以恢复上一个活动实例,或
  • 当你不再需要相机时,请将其释放
 类似资料:
  • 我已创建WebView活动并正在加载https://web.doar.zone/c冠状病毒 这个URL需要相机权限,这是我在Android中获得的运行时权限。 下面是mainactivity.java的完整代码:

  • 我正在尝试使用播放器模块访问android摄像头,但我遇到了以下错误,我不知道如何解决它。 这是我的密码。 我的建筑工人。规格: 有办法解决吗?

  • 我在Ubuntu16.0.4上安装了一个新的Opencv,我编写了一个程序来获取相机流并存储一些帧。它“没有”问题。但不能通过Systemd工作。systemd单元处于活动状态(不要失败),但目标文件夹中没有帧存储。 我一步一步地寻找问题,我发现代码挂在打开摄像头流上。那就是:帽子。打开(“MyIpCameraAddress”) 我试着通过bash脚本而不是脚本来运行代码。但问题依然存在 说明=a

  • 我是新的Android 6.0代码,请提供以下代码的解决方案: 注意:适用于打开库时

  • 我遇到toast错误它将进入我在清单中正确地授予了摄像头权限 这是我的kt代码。 帮忙解决这个问题?

  • 表情测试 图片转文字 相框 拍摄图片