小编DoD*_*oDo的帖子

如何仅从AAR导入选定的本机库ABI?

我有一个不寻常的问题 - 我的Android应用程序包含本机库,我为armeabi-v7a和x86构建了本机库.但是,现在我需要将第三方库集成到我的应用程序中,该应用程序还包含本机库(第三方库是Crashlytics,我从build.gradle中通过Maven包含它).问题是,第三方库的AAR提供了所有arhitectures(armeabi,arm64-V8A,armeabi-V7A,MIPS,MIPS64,x86和x86_64的)和我的应用程序只支持armeabi-V7A和x86(arm64-V8A计划在不久的将来) ,所以当最终的apk构建时,它包含第三方库的所有ABI,并且只有我的本机代码的x86和armeabi-v7a ABI.这会导致我的应用程序在像Galaxy S6这样的arm64设备上启动时崩溃.

我的问题是:是否可以仅包含来自第三方AAR的选定ABI?

请注意,我知道APK拆分,但这只能部分地解决我的问题,即仅当我通过Play商店分发我的应用程序时才有效.虽然Play商店支持beta测试发布,但更新APK的传播速度相当慢,因此在推送应用PlayStore测试频道的更新之前,我们通过Crashlytics的beta发布系统推送更新,速度要快得多.问题是Crashlytics的distibution系统不支持APK拆分(或者我错了吗?).因此,我实际上需要构建一个仅包含选定ABI的"通用"APK.怎么实现呢?

虽然我甚至对Crashlytics特定的答案感到满意(例如,如何通过他们的beta频道分发APK分割),但我会更满意的是构建仅包含选定ABI的"通用"APK的解决方案,因为在我们公司还向客户提供SDK作为AAR档案,其中仅包含支持的架构,我们希望在他们将SDK与支持不同ABI的其他SDK集成时如何处理案例.

我使用最新稳定的Android工作室(1.2.1.1),gradle 2.4和android gradle插件版本1.2.3.

android gradle crashlytics android-gradle-plugin crashlytics-beta

28
推荐指数
2
解决办法
8151
查看次数

如何在 Javascript 中选择合适的后置摄像头?

我正在使用在网络浏览器中从相机设备navigator.mediaDevices.getUserMedia打开MediaStream。我的应用程序想要在 WebAssembly 中进行一些实时图像处理,为此,我需要直接从相机提供实时图像流。

我的解决方案在大多数设备上都运行良好,但是,我在具有多个后置摄像头的设备上遇到了问题,例如 Android 版 Google Chrome 上的三星 Galaxy S10。问题在于以下代码段:

const constraints = {
    audio: false,
    video: {
        width: { min: 640, ideal: 1280, max: 1920 },
        height: { min: 480, ideal: 720, max: 1080 },
        facingMode: { ideal: 'environment' },
    }
};
const stream = await navigator.mediaDevices.getUserMedia( constraints );
Run Code Online (Sandbox Code Playgroud)

总是打开一个错误的相机 - 不支持自动对焦并提供对我的代码来说太扭曲的图像的广角镜头相机。广角镜头适合风景摄影,但对于条码和文本扫描却很糟糕。

如何使用MediaTrackConstraints选择正确的相机?我也试过添加

focusMode: { ideal: 'continuous' }
Run Code Online (Sandbox Code Playgroud)

到约束(根据MDN 文档,这应该是图像轨道的可能约束),但它似乎不起作用。

我也尝试枚举所有设备(来自这个 SO answer),但我不知道如何正确选择正确的相机。

值得注意的是,这个代码片段:

const devices = await …
Run Code Online (Sandbox Code Playgroud)

javascript camera android google-chrome webrtc

24
推荐指数
1
解决办法
3850
查看次数

如何在Android N多窗口模式下确定正确的设备方向?

多窗口文档:

多窗口模式下禁用的功能

当设备处于多窗口模式时,某些功能被禁用或忽略,因为它们对于可能与其他活动或应用共享设备屏幕的活动没有意义.这些功能包括:

  • 某些系统UI自定义选项已禁用; 例如,如果应用程序未以全屏模式运行,则无法隐藏状态栏.
  • 系统忽略对android:screenOrientation属性的更改.

我得到了大多数应用程序,纵向和横向模式之间的区别是没有意义的,但是我正在使用SDK,其中包含用户可以进行任何活动的摄像机视图 - 包括支持多窗口模式的活动.问题是摄像机视图包含显示摄像机预览的SurfaceView/TextureView,并且为了在所有活动方向上正确显示预览,需要有关正确活动方向的知识,以便可以正确旋转摄像机预览.

问题是我的代码通过检查当前配置方向(纵向或横向)和当前屏幕旋转来计算正确的活动方向.问题是在多窗口模式下,当前配置方向不反映真实的活动方向.这会导致相机预览旋转90度,因为Android报告的配置与方向不同.

我目前的解决方法是检查所请求的活动方向并以此为基础,但有两个问题:

  1. 请求的活动方向不必反映实际的活动方向(即可能仍未满足请求)
  2. 请求的活动方向可以是"后方","传感器","用户"等,它们不会显示有关当前活动方向的任何信息.
  3. 根据文档,在多窗口模式下实际上忽略了屏幕方向,因此1.和2.只是不起作用

即使在多窗口配置中,有没有办法可以稳健地计算正确的活动方向?

这是我目前使用的代码(请参阅有问题的部分的注释):

protected int calculateHostScreenOrientation() {
    int hostScreenOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
    WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
    int rotation = getDisplayOrientation(wm);

    boolean activityInPortrait;
    if ( !isInMultiWindowMode() ) {
        activityInPortrait = (mConfigurationOrientation == Configuration.ORIENTATION_PORTRAIT);
    } else {
        // in multi-window mode configuration orientation can be landscape even if activity is actually in portrait and vice versa
        // Try determining from requested orientation (not entirely correct, …
Run Code Online (Sandbox Code Playgroud)

camera android multi-window android-camera android-7.0-nougat

23
推荐指数
1
解决办法
1395
查看次数

颠倒相机预览字节数组

我有一个相机应用程序,锁定到景观.需要时,我会旋转从中获取的原始字节,onPreviewFrame()并使用它们对视频进行编码.

然而,这种方法在Nexus 5X和6设备中失败了,因为它们的反向传感器让我倒置了帧.

随着旋转的预览会不会帮助我在这种情况下,描述在这里:

这不影响在onPreviewFrame(byte [],Camera)中传递的字节数组的顺序

我想知道是否有任何方法可以检测相机传感器是否反转和/或原始帧是否颠倒,因此在旋转时会增加额外的校正.

camera android android-camera nexus6

20
推荐指数
1
解决办法
2414
查看次数

Android视频帧处理

我正在开发应用程序,在相机帧上进行一些实时图像处理.为此,我使用预览回调的方法onPreviewFrame.
这适用于支持分辨率至少为640x480或更大的预览帧的相机.但是当相机不支持如此大的相机预览分辨率时,应用程序被编程为拒绝处理这样的帧.现在,我遇到的问题是像Sony XperiaGo 这样的手机.这是一个非常好的设备,可以录制分辨率高达1280x720的视频,但遗憾的是最大相机预览尺寸为480x320,这对我的需求来说太小了.

我想知道的是如何获得这些larger camera frames(最高1280x720或更高)?显然它必须是可能的,因为相机应用程序能够以该分辨率录制视频 - 因此该应用程序必须能够以某种方式访问​​那些较大的帧.如何从我的应用程序中执行相同的操作?

应用程序必须支持Android 2.1及更高版本,但即使我找到针对Android 4.0或更新版本的问题的解决方案,我也会非常高兴.

这个问题类似http://stackoverflow.com/questions/8839109/processing-android-video-frame-by-frame-while-recording,但我不需要保存视频 - 我只需要那些高分辨率的视频帧......

非常感谢你提前!

video camera android image-processing computer-vision

17
推荐指数
1
解决办法
6377
查看次数

为什么sizeof(std :: variant <char>)== 8使用libc ++而不是2(比如MSVC的STL和libstdc ++)?

在Compiler explorer上考虑这个例子.

基本上,我们有这个代码片段:

#include <cstdint>
#include <variant>

enum class Enum1 : std::uint8_t { A, B };

enum class Enum2 : std::uint8_t { C, D };

using Var = std::variant< Enum1, Enum2 >;
using Var2 = std::variant< char >;

template< std::size_t s >
struct print_size;

void func() {
    print_size< sizeof( Var ) >{};
    print_size< sizeof( Var2 ) >{};
}
Run Code Online (Sandbox Code Playgroud)

如果我们使用GCC的libstdc ++(使用clang或GCC)编译它,我们会得到预期的编译错误:

error: implicit instantiation of undefined template 'print_size<2>'
Run Code Online (Sandbox Code Playgroud)

此外,与MSVC类似(如预期):

error C2027: use of undefined type 'print_size<2>'
Run Code Online (Sandbox Code Playgroud)

但是,当使用clang与libc ++时,我收到此错误: …

c++ libc++ c++17 std-variant

12
推荐指数
1
解决办法
425
查看次数

为什么GCC优化不适用于valarrays?

这是一个使用valarrays的简单c ++程序:

#include <iostream>
#include <valarray>

int main() {
    using ratios_t = std::valarray<float>;

    ratios_t a{0.5, 1, 2};
    const auto& res ( ratios_t::value_type(256) / a );
    for(const auto& r : ratios_t{res})
        std::cout << r << " " << std::endl;
    return 0;  
}
Run Code Online (Sandbox Code Playgroud)

如果我编译并运行它像这样:

g++ -O0 main.cpp && ./a.out
Run Code Online (Sandbox Code Playgroud)

输出如预期:

512 256 128 
Run Code Online (Sandbox Code Playgroud)

但是,如果我编译并运行它:

g++ -O3 main.cpp && ./a.out
Run Code Online (Sandbox Code Playgroud)

输出是:

0 0 0 
Run Code Online (Sandbox Code Playgroud)

如果我使用-O1优化参数,也会发生相同

GCC版本是(最新的Archlinux):

$ g++ --version
g++ (GCC) 6.1.1 20160707
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试使用clang,两者都可以

clang++ -std=gnu++14 -O0 main.cpp && ./a.out
Run Code Online (Sandbox Code Playgroud)

和 …

c++ gcc g++ clang++

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

替换 InstrumentationRegistry.getContext() 的示例

对于 AndroidX,InstrumentationRegistry 现在已弃用。该文件指出

此方法已弃用。在大多数情况下,应该使用 getApplicationContext() 而不是仪器测试上下文。如果您确实需要访问测试上下文以访问其资源,则建议改用 getResourcesForApplication(String)。

但是,我找不到有关如何获取PackageManager要调用的in test实例getResourcesForApplication以及应为其字符串参数提供哪个包名称的任何示例。

例如,这是当前有效的代码:

import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;

import org.junit.Test;
import org.junit.runner.RunWith;

import java.io.IOException;
import java.io.InputStream;

import androidx.test.InstrumentationRegistry;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;

import static org.junit.Assert.*;

@RunWith(AndroidJUnit4.class)
public class MyTest {

    @Test
    public void processImage() {
        // load image from test assets
        AssetManager am = InstrumentationRegistry.getContext().getAssets();
        InputStream is = null;
        Bitmap image = null;
        try {
            is = am.open("image.jpg");
            image = BitmapFactory.decodeStream(is);
        } catch (IOException e) { …
Run Code Online (Sandbox Code Playgroud)

junit android android-instrumentation

8
推荐指数
1
解决办法
129
查看次数

这应该是 constexpr 还是不?

考虑这个代码片段(Godbolt):

#include <cstdio>
#include <string>
#include <string_view>

struct Option
{
    std::string_view name;

    constexpr Option( std::string_view const n ) noexcept : name{n} {}
};

template< std::size_t N >
class TransformedOption : public Option
{
public:
    constexpr TransformedOption( std::string_view const nameStr ) :
        Option{ { nameStorage_, N - 1 } }
    {
        for ( auto i = 0U; i < N; ++i )
        {
            if ( nameStr[ i ] == '_' ) { nameStorage_[ i ] = '-'; }
            else …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++20

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

如何删除cmake静态库的编译依赖项?

考虑以下CMake设置:

add_library( A STATIC modules/a/src/src1.cpp modules/a/src/src2.cpp )
target_include_directories( A PUBLIC modules/a/inc )
target_compile_definitions( A PUBLIC USING_A=1 )

add_library( B STATIC modules/b/src/src1.cpp modules/b/src/src2.cpp )
target_include_directories( B PUBLIC modules/b/inc )
target_compile_definitions( B PUBLIC USING_B_WRAPPER=1 )
target_link_libraries( B PUBLIC A )

add_library( C STATIC modules/c/src/src1.cpp )
target_include_directories( C PUBLIC modules/c/inc )
target_link_libraries( C PUBLIC B )
Run Code Online (Sandbox Code Playgroud)

让我们假设from的modules/b/incheader头来自modules/a/inc,因此B库的任何使用者也必须添加modules/a/inc其include路径并添加USING_A=1预处理器定义。

让我们用Ninja生成器(但任何发生器,包括出现问题MakefileXcodeVisual Studio):

cmake -GNinja ../path/to/source
Run Code Online (Sandbox Code Playgroud)

让我们构建C库: …

cmake

6
推荐指数
1
解决办法
1196
查看次数