标签: android-api-levels

.NET MAUI:如何确保 Android 平台特定代码仅在支持的 Android 版本上执行?

我有各种实现来partial class DeviceServices为 Android、iOS 等提供某些设备或操作系统特定功能的平台特定实现。我的应用程序的目标 API 级别为 33.0,最低版本为 API 级别 21.0。

某些 API 特定于某些 Android 版本及更高版本,因此我想确保仅在受支持的版本上调用它们。但是,我总是收到以下警告(以及类似的警告,具体取决于所使用的 API):

警告 CA1416:可在“Android”21.0 及更高版本上访问此调用站点。“WindowInsets.Type.SystemBars()”仅支持:“android”30.0 及更高版本。

以下隐藏和显示系统栏的代码适用于我迄今为止尝试过的所有设备和模拟器,但我担心早期的 Android 版本。尽管检查了正确的目标 API 版本,我仍然收到上面的警告:

static partial class DeviceServices
{
    private static Activity _activity;

    public static void SetActivity(Activity activity)
    {
        _activity = activity;
    }

    public static partial void HideSystemControls()
    {
#if ANDROID30_0_OR_GREATER
       if (Build.VERSION.SdkInt >= BuildVersionCodes.R) //R == API level 30.0
       {
            _activity?.Window?.InsetsController?.Hide(WindowInsets.Type.SystemBars());
       }
#endif
    }

    public static partial void ShowSystemControls()
    {
#if ANDROID30_0_OR_GREATER
       if (Build.VERSION.SdkInt >= …
Run Code Online (Sandbox Code Playgroud)

c# android conditional-compilation android-api-levels maui

7
推荐指数
2
解决办法
6728
查看次数

在代码中抑制API级别警告

我正在尝试创建一个创建一个兼容API级别高于.ms的短信的意图KitKat.该代码有效,但我收到了一个警告,即API级别19是必需的.我试图解决它,@TargetApi(Build.VERSION_CODES.KITKAT)但得到一个警告" Annotations这里不允许".

是否有一种简单的方法可以忽略此警告?

private boolean apLowerThanKitKat = (Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.KITKAT);

Intent smsIntent = new Intent(android.content.Intent.ACTION_SEND);
if (apLowerThanKitKat)
{
    smsIntent.setPackage("vnd.android-dir/mms-sms");
}
else
{
    //@TargetApi(Build.VERSION_CODES.KITKAT)
    smsIntent.setPackage(Telephony.Sms.getDefaultSmsPackage(getActivity()));
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

android android-api-levels

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

停止记录Android Beacon Library

我试图阻止Android信标库的调试,但它不起作用.

我在我的gradle中有这个:

compile 'org.altbeacon:android-beacon-library:2.3.3'
Run Code Online (Sandbox Code Playgroud)

我试过了:

public BeaconManager(Context ctx, org.altbeacon.beacon.BeaconManager beaconManager) {
    mContext = ctx;
    this.beaconManager = beaconManager;


    // this is saying deprecated
    this.beaconManager.setDebug(false);

    // I also tried this and the same thing
    org.altbeacon.beacon.logging.LogManager.setVerboseLoggingEnabled(false);
Run Code Online (Sandbox Code Playgroud)

但无论如何,我一直在获取这些日志.他们开始调试其他事情.

02-18 16:21:29.784 31809-31818/com.myapp D/ScanRecord: first manudata for manu ID
02-18 16:21:29.784 31809-31818/com.myapp D/BluetoothLeScanner: onScanResult() - ScanResult{mDevice=45:0A:1B:49:64:7F, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=[f41ef1ee-fde5-23be-5f4b-589c71babfdd], mManufacturerSpecificData={76=[2, 21, 97, 104, 113, 9, -112, 95, 68, 54, -111, -8, -26, 2, -11, 20, -55, 109, 0, 3, 17, -71, -89]}, mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=BC Beacon?], …
Run Code Online (Sandbox Code Playgroud)

android proximity beacon android-api-levels

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

Android Gradle产生一个TransformException:java.util.zip.ZipException:在transformClassesWithDexForRelease期间打开zip文件时出错

我在android studio中有一个Android应用程序的项目.该项目有6个模块(3个内部库,1个Android应用程序模块,1个可穿戴模块和1个用于在应用程序和可穿戴设备之间共享代码的模块),一切运行良好,直到我们决定更改应用程序的最小android sdk.

它最初与16+兼容,我们希望使它成为21+.我们尝试只更改最小sdk,升级最小sdk和编译sdk(到23和24或21 ......)甚至升级构建工具(到23中的23)但似乎没有任何工作...我设法当我启用gradle守护进程时出现"我有时"的工作原因我真的不明白,但这对于我们构建CI来说并不是一个很好的选择.

所以完全绝望,我问是否有人知道可能是什么问题......

错误是com.android.build.api.transform.TransformException:java.util.zip.ZipException:打开zip文件时出错.我从来没有在构建时看到它但我们也运行"connectedAndroidTest"我们似乎打包每个模块并且这个错误发生在随机模块中并且使用--info或--debug构建并不表示哪个zip文件打开导致错误. .

 1:Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':shared:transformClassesWithDexForDebugAndroidTest'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: error in opening zip file

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
==============================================================================

2: Task failed with an exception.
-----------
* What went wrong:
Execution failed for task ':common:messages:transformClassesWithDexForDebugAndroidTest'.
> com.android.build.api.transform.TransformException: java.util.zip.ZipException: error in opening zip file

* Try: …
Run Code Online (Sandbox Code Playgroud)

dependencies android gradle android-api-levels

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

Android的新64位要求是否意味着具有本地代码的应用程序的新最低API级别为21?

考虑以下:

  • 通常,开发人员会将其设置minSdkVersion为16,因为它覆盖了99%以上的设备(1)。
  • 但是,从2019年8月1日起,Android将要求所有应用程序提供64位版本(2)。
  • 此外,NDK API级别(设置为-D__ANDROID_API__)必须等于minSdkVersion3)。
  • 最后,运行在arm64-v8a上的Android设备不支持任何低于API级别21(4)的设备。

我试图进行研究以弄清楚所有这些东西是如何工作的-直到现在我一直主要通过试图建立依赖关系以将我的C ++库移植到Android来破解自己的方式-请原谅如果我缺少明显的东西。但是在我看来,上述表明从Android NDK生成的应用必须从2019年8月1日开始将最低API级别定位为21.这是否正确?

参考文献:

android android-ndk android-api-levels

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

文本转语音功能在 API 级别 30 中无法正常工作(英语除外)

我用“印地语”语言实现了文本到语音转换,它是一种印度语言,我的应用程序在 API 级别 29 之前工作正常。它对于英语工作正常,但对于印地语则不然。但在 API 级别 30 的新设备中,它不起作用。在 API 级别 30 设备中调试其给出的结果值 -2“语言不支持错误”。

private void setTextTospeech() {
    textToSpeech = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status == TextToSpeech.SUCCESS) {
                if (language.toLowerCase().contains(langaugeCodeEnglish)) {
                    int result = textToSpeech.setLanguage(new Locale("en", "IN"));
                    if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                        //Toast.makeText(mContext, result + " is not supported", Toast.LENGTH_SHORT).show();
                        Log.e("Text2SpeechWidget", result + " is not supported");
                    }
                } else {
                    int result = textToSpeech.setLanguage(new Locale("hi", "IN"));
                    if …
Run Code Online (Sandbox Code Playgroud)

android text-to-speech android-manifest android-studio android-api-levels

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

Android 深层链接不适用于目标 SDK 33

我们最近将我的应用程序目标 SDK 迁移到 33,因此应用程序链接在模拟器中无法正常工作,但在真实设备中却无法正常工作

我用谷歌搜索了一下,并在我的设备中手动选择了网址,链接工作正常,但我不能要求应用程序用户每次都这样做

我已经阅读了android文档

https://developer.android.com/training/app-links/verify-android-applinks#manual-verification

这里他们提到了手动验证Android 12以上的Domines的过程

但是当我运行adb shell am compat enable 175408749 com.myapp.package

终端正在抛出消息说

无法覆盖 com.modere.global 的 175408749,因为应用的 targetSdk (33) 高于更改的 targetSdk 阈值 (30)

我如何验证域名,请帮助我

java android kotlin android-studio android-api-levels

6
推荐指数
0
解决办法
1735
查看次数

android gridlayout未显示在模拟器API 22中

我有一个应用程序在运行 API 23 的实际设备 Nexus 6P 和运行 API 24 的模拟 6P、5 和 4 上完全按需要运行,但GridLayout在运行 API 22 的模拟 Nexus 5 和 4 上显示出奇怪的行为。

该应用程序只有一个活动,其中包含多个RelativeLayout以编程方式设置的.VISIBLE& .INVISIBLE。在一个这样的RelativeLayout我有 2 GridLayouts 如下。模拟 API 22 时,底部GridLayout不显示,但顶部始终显示,与 API 22、23 或 24GridLayout无关。底部仅在我将模拟器设置更改为 API 24 时显示(未尝试 23)。为什么会这样?我认为我没有使用任何GridLayout需要 API 23 或更高版本的东西。此问题意味着我无法在运行 API 22 或 21 的 Nexus 5 上安装此应用程序。感谢您的任何建议。

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/gameOperations"
    android:visibility="invisible">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/launchDisplay"
        android:gravity="center_horizontal">

        <TextView
            android:text="@string/app_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" …
Run Code Online (Sandbox Code Playgroud)

android android-emulator android-gridlayout android-relativelayout android-api-levels

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

在 API 级别 30 中不推荐使用 getSize()

我使用 getSize() 方法来获取屏幕尺寸:

override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
    val fragmentActivity = requireActivity()
    ...
    val wm = fragmentActivity.getSystemService(Context.WINDOW_SERVICE) as WindowManager 
    val display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        fragmentActivity.display
    } else {
        wm.defaultDisplay 
    }
    val size = Point()
    display?.getSize(size)
    
    // get screen sizes
    val width = size.x
    val height = size.y
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是在 API 级别 30 中,方法 getSize() 被声明为已弃用。

什么可以代替 getSize() 用于获取屏幕尺寸?

感谢您的任何评论/回答!

解决方案

val wm = fragmentActivity.getSystemService(Context.WINDOW_SERVICE) as WindowManager
val width: Int
val height: Int
if (Build.VERSION.SDK_INT …
Run Code Online (Sandbox Code Playgroud)

android deprecation-warning android-api-levels

5
推荐指数
3
解决办法
2862
查看次数

来自`androidx.appcompat.AppCompatIssueRegistry`的“过时的自定义lint检查”需要更新的API级别

我有一个项目,其中收到以下 Android lint 警告:

过时的自定义 lint 检查

../../../../../../../.gradle/caches/transforms-2/files-2.1/fc4398fa701898f50fcec85691d33578/appcompat-1.2.0/jars/lint.jar:发现Lintandroidx.appcompat.AppCompatIssueRegistry需要更新 API 级别的问题注册表 ( )。这意味着自定义 lint 检查适用于较新的 lint 版本;请升级 Lint 可以通过“自定义检查”进行扩展:由开发人员和库实施的额外检查,例如强制执行库或公司编码风格指南所需的特定 API 使用。

Lint API 尚不稳定,因此这些检查可能会导致性能下降、停止工作或提供错误结果。

此警告标记发现使用过时 API 并且需要更新以在当前 lint 环境中运行的自定义 lint 检查。

它还可能标记发现使用较新版本 API 的问题,这意味着您需要使用较新版本的 lint(或 Android Studio 或 Gradle 插件等)来处理这些检查。要抑制此错误,请使用问题 ID“ObsoleteLintCustomCheck”,如抑制警告和错误部分所述。

ObsoleteLintCustomCheck 警告优先级 10/10

我什至不知道这意味着什么,我不使用任何自定义的 lint 东西。它也只出现在 app 模块中,而不出现在库模块中。

我刚刚将我的项目从 API 26 提升到 30,并切换到 AndroidX/JetPack。

要重现它,请克隆项目,签出commit 96273fd8b1af5d5c63603b7df71e0849f518a9e5,更改到android/子目录并运行./gradlew lint. 我不知道这是否可以减少或如何减少(我是 Android 开发的新手,因为它的问题而诅咒天空,自 1980 年代后期以来一直在开发软件)。

android android-lint android-api-levels

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