小编Dud*_*ude的帖子

Camera2了解传感器和设备方向

在尝试使用Android Camera2实现触控聚焦功能时,我遇到了一个问题.

理论很简单:

  • 获取预览表面中的拍子位置
  • 将其映射到传感器或传感器裁剪区域的尺寸(如果是缩放),请确保在需要时反转尺寸
  • 应用基础更改以与传感器相同的基础结束
  • MeteringRectangle出来的结果,并在一个新的使用CaptureRequest

有很多例子展示了如何处理第一点和最后一点,但没有多少以可理解的方式处理第二点和第三点.文档和示例并不是很清楚,可能会让人感到困惑.

开始了...


CameraCharacteristics.SENSOR_ORIENTATIONIS形容为

顺时针角度,输出图像需要通过该角度以原始方向旋转到设备屏幕上.

知道传感器坐标系定义为(0,0)是有源像素阵列中的左上角像素,我将其读作将传感器坐标系中捕获的图像旋转到可能产生的位置所需的角度图像在原始方向上看起来很直立.因此,如果传感器的顶部朝向具有纵向原始方向的手机的右侧,SENSOR_ORIENTATION则将为90°. 传感器方向


获得的显示方向mActivity.getWindowManager().getDefaultDisplay().getRotation();记录为:

返回屏幕从"自然"方向的旋转.返回的值可能是Surface.ROTATION_0(无旋转),Surface.ROTATION_90,Surface.ROTATION_180或Surface.ROTATION_270.例如,如果设备具有自然高的屏幕,并且用户将其侧面转向横向,则此处返回的值可以是Surface.ROTATION_90或Surface.ROTATION_270,具体取决于它的转向.角度是屏幕上绘制图形的旋转,这是设备物理旋转的相反方向.例如,如果设备逆时针旋转90度,则补偿渲染将顺时针旋转90度,因此返回的值将为Surface.ROTATION_90.

我发现这个定义比传感器定位更清晰,没有解释的地方.


现在事情开始变得难看......

我决定使用Camera2Raw示例中提供的方法来获取从传感器方向到设备方向的旋转.

/**
 * Rotation need to transform from the camera sensor orientation to the device's current
 * orientation.
 *
 * @param c                 the {@link CameraCharacteristics} to query for the camera sensor
 *                          orientation.
 * @param deviceOrientation the current device orientation relative to the native device
 *                          orientation.
 * @return the …
Run Code Online (Sandbox Code Playgroud)

android rotation android-camera2

18
推荐指数
1
解决办法
3326
查看次数

Android Studio 4.1:矢量可绘制对象中的主题属性导致 java.lang.IllegalArgumentException

我刚刚转移到 Android Studio 4.1,现在在制作我的项目时,它在我的矢量绘图中产生了新的崩溃。

我在我的向量中使用主题属性,但这些属性似乎不再受支持:

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24"
    android:viewportHeight="24">
  <path
      android:pathData="..."
      android:fillColor="?attr/colorPrimary"
      android:fillType="nonZero"/>
  <path
      android:pathData="..."
      android:fillColor="?attr/colorOnPrimary"
      android:fillType="nonZero"/>
</vector>
Run Code Online (Sandbox Code Playgroud)
Cause 1: org.gradle.workers.internal.DefaultWorkerExecutor$WorkExecutionException: A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
    at org.gradle.workers.internal.DefaultWorkerExecutor$WorkItemExecution.waitForCompletion(DefaultWorkerExecutor.java:336)
    at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:142)
    at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForItemsAndGatherFailures(DefaultAsyncWorkTracker.java:90)
    at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForAll(DefaultAsyncWorkTracker.java:80)
    at org.gradle.internal.work.DefaultAsyncWorkTracker.waitForCompletion(DefaultAsyncWorkTracker.java:68)
    at org.gradle.workers.internal.DefaultWorkerExecutor.await(DefaultWorkerExecutor.java:244)
    at com.android.build.gradle.internal.tasks.Workers$WorkerExecutorAdapter.await(Workers.kt:188)
    at com.android.ide.common.resources.MergeWriter.end(MergeWriter.java:48)
    at com.android.ide.common.resources.MergedResourceWriter.end(MergedResourceWriter.java:241)
    at com.android.ide.common.resources.DataMerger.mergeData(DataMerger.java:292)
    at com.android.ide.common.resources.ResourceMerger.mergeData(ResourceMerger.java:385)
    at com.android.build.gradle.tasks.MergeResources.lambda$doFullTaskAction$1(MergeResources.java:319)
    at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:58)
    at com.android.build.gradle.tasks.MergeResources.doFullTaskAction(MergeResources.java:315)
    at com.android.build.gradle.internal.tasks.IncrementalTask.handleIncrementalInputs(IncrementalTask.kt:110)
    at com.android.build.gradle.internal.tasks.IncrementalTask.access$handleIncrementalInputs(IncrementalTask.kt:65)
    at com.android.build.gradle.internal.tasks.IncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(AndroidVariantTask.kt:73)
    at com.android.build.gradle.internal.tasks.IncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(AndroidVariantTask.kt:34)
    at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:91)
    at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction$gradle(IncrementalTask.kt:137)
    at sun.reflect.GeneratedMethodAccessor591.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
    at org.gradle.api.internal.project.taskfactory.IncrementalTaskInputsTaskAction.doExecute(IncrementalTaskInputsTaskAction.java:47) …
Run Code Online (Sandbox Code Playgroud)

android android-studio android-vectordrawable

11
推荐指数
1
解决办法
1192
查看次数

方向更改时未调用onCreateLoader

我的问题基本上与这个问题相同:有时在调用initLoader后没有得到onCreateLoader回调

我有2个ListFragments包含在ViewPager.它们首先加载正常,但是当我改变方向时,该initLoader方法不会调用onCreateLoader.但是,如果我恢复到初始方向,一切都很好.

这是我的代码FragmentActivity:

import java.util.Locale;

import com.d.camera.R;
import com.d.camera.R.id;
import com.d.camera.R.layout;
import com.d.camera.R.menu;
import com.d.camera.R.string;

import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.app.NavUtils;
import android.support.v4.view.ViewPager;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class HistoryFragments extends FragmentActivity implements
    ActionBar.TabListener {

/**
 * The {@link android.support.v4.view.PagerAdapter} that will provide
 * fragments for each of the …
Run Code Online (Sandbox Code Playgroud)

android

7
推荐指数
1
解决办法
3724
查看次数

Gradle 如何用“variant.getPackageLibraryProvider()”替换过时的“variantOutput.getPackageLibrary()”?

我有一个具有多种风格的 Android 库项目。我使用'maven-publish'插件将这些不同风格的 aar 文件上传到私人存储库。我一直在使用variant.outputs[0].outputFile作为publishing.publications.artifact参数的值。

publishing.publications.create variant.flavorName, MavenPublication, {
            groupId "$libraryGroupId.$variant.flavorName"
            artifactId libraryArtifactId
            version libraryVersion
            artifact variant.outputs[0].outputFile           
        }
Run Code Online (Sandbox Code Playgroud)

它运行良好,但我最近更新了库的 gradle 插件com.android.tools.build:gradle:3.3.2并收到以下警告:

警告:API 'variantOutput.getPackageLibrary()' 已过时并已替换为 'variant.getPackageLibraryProvider()'。它将在 2019 年底移除。有关更多信息,请参阅https://d.android.com/r/tools/task-configuration-avoidance。要确定是什么调用了 variantOutput.getPackageLibrary(),请在命令行上使用 -Pandroid.debug.obsoleteApi=true 以显示堆栈跟踪。

这本身不是问题,因为它仍然有效,但我不喜欢这个警告,因为我一直在清理我的东西build.gradle,我想我会尝试修复它。

我尝试了很多不同的组合,在互联网上搜索以尝试查找有关如何从包库提供商处获取 aar 的信息。关于这个主题几乎没有可用的东西(这真的很令人沮丧),但我确实找到了这篇文章,这让我尝试:

variant.getPackageLibraryProvider().get()

这提供了一个com.android.build.gradle.tasks.BundleAar在设置为发布的工件 ( artifact variant.getPackageLibraryProvider().get())时似乎可以工作并修复了警告的方法。

这是解决此警告的正确方法还是会因某种原因适得其反?有谁知道我可以从哪里获得有关此的更多信息?

android build.gradle android-gradle-plugin

5
推荐指数
1
解决办法
2565
查看次数

Camera2 在 Android API 29 中用两个物理流替换一个逻辑流

当Android 9(API 28)发布时,我很高兴地发现具有多个摄像头的手机的物理摄像头将被暴露,我曾因无法访问它们而感到非常沮丧。今天我偶然发现了 android Q文档,其中写道:

从 API 级别 29 开始,部分或所有物理相机可能无法独立向应用程序公开,在这种情况下,物理相机 ID 在 CameraManager.getCameraIdList() 中将不可用。但应用程序仍然可以通过调用CameraManager.getCameraCharacteristics(String)来查询物理相机的特征。

这个说法让我很困惑,难道Android正在回溯吗?改变的目的是什么?

我对在非常精细的水平上管理相机感兴趣,这一变化是否会阻止我做我今天能够使用 Android 9 做的事情?

上面说可以不再列出ID,但是仍然可以查询特征,那么在没有ID的情况下如何获取摄像机的特征呢?我想我们应该通过getPhysicalCameraIds()逻辑摄像机获取物理摄像机的 ID,但这是否意味着如果我们想使用“隐藏”摄像机,我们就必须测试一堆随机 ID 字符串?

在此输入图像描述

我们是否仍然能够在未暴露的物理相机上使用SessionConfiguration创建捕获会话?

有人可以解释一下吗?

android android-camera2

5
推荐指数
1
解决办法
4207
查看次数