标签: androidx

WorkManager 导致广播 ANR

我正在使用新库WorkManager 进行定期工作和一次性工作请求。目前使用的lib版本是1.0.0,最小SDK是21,编译是28。

工作管理器按照文档中的描述完成工作,但会导致在 Play 商店控制台中看到大量 ANR。

我正在使用代码来触发工作,例如:

     WorkManager.getInstance().enqueueUniquePeriodicWork(
                tag,
                ExistingPeriodicWorkPolicy.KEEP,
                workRequest
        )
and         WorkManager.getInstance().enqueue(workRequest)
Run Code Online (Sandbox Code Playgroud)

最常见的 ANR 来自带有封装的广播接收器,androidx.work.impl.background.systemalarm.RescheduleReceiver这主要是 OnePlus 手机的问题。我发现,在工作管理问题追踪某种联系的问题,但这个国家的bug修复在以前的版本这个问题。尽管如此,按照跟踪器中提到的步骤,我看到日志显示此问题在 1.0.0 版中仍然存在。我所看到的 ANR 无法在我拥有的测试设备上重现。

android android-anr-dialog kotlin android-jetpack androidx

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

尝试模拟 NavController 时出错

尝试按照示例https://developer.android.com/guide/navigation/navigation-testing,我有一个预期的错误

org.mockito.exceptions.base.MockitoException:Mockito 无法模拟此类:类 androidx.navigation.NavController。

即使包含所有依赖项,如下所示: https: //developer.android.com/training/testing/set-up-project

@RunWith(AndroidJUnit4::class)
class MyShopFragmentTest {

    @Test
    fun testMyShopScenario_F001() {
        // Create a mock NavController
        val mockNavController = mock(NavController::class.java)

        // Create a graphical FragmentScenario for the MyShopFragment
        val myShopFragmentScenario = launchFragmentInContainer<MyShopFragment>()

        // Set the NavController property on the fragment
        myShopFragmentScenario.onFragment { fragment ->
            Navigation.setViewNavController(fragment.requireView(), mockNavController)
        }

        // Verify that performing a click prompts the correct Navigation action
        onView(ViewMatchers.withId(R.id.search)).perform(ViewActions.click())
        verify(mockNavController).navigate(R.id.searchFragment)
    }
}
Run Code Online (Sandbox Code Playgroud)

任何想法?

android mockito androidx

8
推荐指数
2
解决办法
2225
查看次数

如何修复 Android 资源链接失败的 dialogCornerRadius not found

我正在开发一个应用程序,我遇到了这个问题。

Android gradle/缓存/转换

Android 资源链接失败 */appcompat-1.0.0/res/values-v28/values-v28.xml:5:5-8:13: AAPT: 错误: 资源 android:attr/dialogCornerRadius 未找到。

我读过这个问题可以通过 API 27 到 28 解决。我遇到的问题是,如果我更新到 28,我会失去我的应用程序的感觉,因为我所有的应用程序都是由 Fragments 制作的,并且是在最新版本的 Android Studio 中api 片段已弃用。

       v28/values-v28.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
          <style name="Base.Theme.AppCompat" parent="Base.V28.Theme.AppCompat"/>
          <style name="Base.Theme.AppCompat.Light" parent="Base.V28.Theme.AppCompat.Light"/>
          <style name="Base.V28.Theme.AppCompat" parent="Base.V26.Theme.AppCompat">
            <!-- We can use the platform styles on API 28+ -->
            <item name="dialogCornerRadius">?android:attr/dialogCornerRadius</item>
          </style>
          <style name="Base.V28.Theme.AppCompat.Light" parent="Base.V26.Theme.AppCompat.Light">
            <!-- We can use the platform styles on API 28+ -->
            <item name="dialogCornerRadius">?android:attr/dialogCornerRadius</item>
          </style>
</resources>
Run Code Online (Sandbox Code Playgroud)

那么,如何运行我的应用程序并保留片段(不更新到 Android 9 api)。

我要修改项目 dialogCornerRadius

android android-appcompat android-fragments android-support-library androidx

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

我将现有项目更新为 androidx 但得到了 ExampleInstrumentedTest--&gt; getTargetContext 错误

当我将项目更新为 androidx 时,出现以下错误

我也搜索过但找不到我的答案,尽管项目运行良好

@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getTargetContext();

        assertEquals("com.example.villagefoodsecrets", appContext.getPackageName());
    }
}
Run Code Online (Sandbox Code Playgroud)

此时,@RunWith(AndroidJUnit4.class)表明它已被弃用。

和Context appContext = InstrumentationRegistry.getTargetContext(); .getTargetContext; 红色格式看起来不存在。那么我能在这里做什么——我应该忽略这个吗?

android androidx

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

捕获 Android 媒体按钮事件

我有一个应用程序启动前台服务来播放一些媒体,我希望能够使用智能手表/耳机上的媒体按钮来控制它,并通过媒体样式通知等来控制它。

但我无法让媒体按钮始终如一地工作。在日志中,我可以看到它们经常被发送到其他应用程序,即使我最后启动了 MediaSession 和播放。

但尽管有一个媒体会话,我在其中 setActive(true) 并定义了媒体回调,但我无法让它工作?

显现:

<service
    android:name=".services.MediaControllerService"
    android:enabled="true"
    android:exported="true"
    android:permission="android.permission.FOREGROUND_SERVICE">
    <intent-filter android:priority="999">
        <action android:name="android.intent.action.MEDIA_BUTTON"/>
    </intent-filter>
</service>
Run Code Online (Sandbox Code Playgroud)

代码(注意这些包,在 android 10 中很难找到一起工作并给我 MediaStyle 的正确包组合)...

import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.media.AudioAttributes;
import android.media.AudioFocusRequest;
import android.media.AudioManager;
import android.media.MediaMetadata;
import android.support.v4.media.MediaMetadataCompat;
import android.support.v4.media.session.MediaControllerCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.PlaybackStateCompat;
import android.view.KeyEvent;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import androidx.media.session.MediaButtonReceiver;

public class TextToSpeechMediaControllerService extends Service { 
    public static final String START_SERVICE_ACTION_INTENT = "serviceStart";
    private TextToSpeechPlayer player;
    private MediaMetadataCompat mediaMetaData; …
Run Code Online (Sandbox Code Playgroud)

android android-mediaplayer android-mediasession androidx

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

如何在 Android Pie 中使用 Intent.ACTION_OPEN_DOCUMENT

我正在使用 android 馅饼中的 Retrofit 制作个人资料照片更改功能。

这样我就成功地将相机拍摄的照片上传到服务器了。但我不知道如何将从图库中选择的照片传输到我的服务器。(我对 Java Kotlin 中的任何类型的代码都很满意。)

我稍后会上传视频。

我在谷歌上搜索了很多,但很难得到我想要的信息。

谷歌文档做得很好,但我不知道该怎么做。 https://developer.android.com/guide/topics/providers/document-provider

Google 文档显示了使用位图或输入流或其他内容的示例。

我需要位图或输入流才能使用 Retrofit 上传照片吗?

我实际上需要一个有效的 uri。

public void performFileSearch() {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");
        startActivityForResult(intent, PICTURES_DIR_ACCESS_REQUEST_CODE);
}


@Override
public void onActivityResult(int requestCode, int resultCode,Intent resultData) {
    if (requestCode == READ_REQUEST_CODE && resultCode ==Activity.RESULT_OK) {
        Uri uri = null;
        if (resultData != null) {
            uri = resultData.getData();
            Log.i(TAG, "Uri: " + uri.toString());
            showImage(uri);
        }
    }
}


public void Edit_Profile (String Image_Uri) {
    File file …
Run Code Online (Sandbox Code Playgroud)

java retrofit2 android-9.0-pie androidx android-10.0

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

androidx.work.impl.WorkManagerInitializer:java.lang.ClassNotFoundException:路径上的“androidx.work.impl.WorkManagerInitializer”:/data/app/app-2.apk

我最近将旧应用程序的后台服务迁移到WorkManager。在最近的设备上(包括 sdk 22),它看起来不错,运行重复的工作单元并按预期在设备重新启动时安排它们。

问题是当我针对旧版本(旧在这里非常相关)进行测试时,Android sdk 14 是我的minSdkVersion. 顺便说一句,也WorkManager应该有相同的:根据doc向后兼容 API 14。如标题所述,我得到的错误是:

 java.lang.RuntimeException: Unable to get provider androidx.work.impl.WorkManagerInitializer: java.lang.ClassNotFoundException: Didn't find class "androidx.work.impl.WorkManagerInitializer" on path: /data/app/com.example.myapp.apk
    at android.app.ActivityThread.installProvider(ActivityThread.java:4822)
Run Code Online (Sandbox Code Playgroud)

我没有任何自定义 WorkManager 配置/初始化,我只是添加了

     implementation 'androidx.work:work-runtime:2.2.0'
Run Code Online (Sandbox Code Playgroud)

到我的模块的 gradle 并非常典型地使用它来安排后台操作。

android-workmanager androidx

8
推荐指数
2
解决办法
2207
查看次数

androidx.paging.PagedListAdapter' 已弃用

我在我的 android 项目中使用 androidx 分页库的 alpha 版本。它曾经工作得很好,但今天我的 Android 工作室开始显示有关PagedListAdapter类的弃用警告。我在google上搜索,也查看了android开发者网站上的官方文档,但没有找到任何东西。

我正在使用以下依赖项:

def paging_version = "3.0.0-alpha06"
implementation "androidx.paging:paging-runtime:$paging_version" //pagination
Run Code Online (Sandbox Code Playgroud)

附上截图供参考:附上截图以供参考

这只是 Android 工作室的一个小故障还是已经被弃用了?

android android-paging androidx android-paging-library

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

警告:[XmlResourcesTransformer] 没有映射:android/support/FILE_PROVIDER_PATHS

在 gradle 同步时,出现错误:

WARNING: [XmlResourcesTransformer] No mapping for: android/support/FILE_PROVIDER_PATHS
Run Code Online (Sandbox Code Playgroud)
WARNING: [XmlResourcesTransformer] No mapping for: android/support/FILE_PROVIDER_PATHS
Run Code Online (Sandbox Code Playgroud)

提供者路径.xml

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-files-path
        name="my_images"
        path="." />
</paths>
Run Code Online (Sandbox Code Playgroud)

怎么解决这个问题呢?

android gradle androidx fileprovider

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

Android GrantPermissionRule 不适用于 api-27

我在我的MainActivityTest班级中配置了如下权限规则

@Rule
public GrantPermissionRule permissionRule =
    GrantPermissionRule.grant(RECORD_AUDIO, WRITE_EXTERNAL_STORAGE);
Run Code Online (Sandbox Code Playgroud)

当我运行以下命令以使用 api 27 在模拟器上执行测试时

./gradlew connectedCheck
Run Code Online (Sandbox Code Playgroud)

它失败并出现以下错误

com.example.myapplication.MainActivityTest > testLaunch_main_activity[Pixel_XL_API_27(AVD) - 8.1.0] FAILED 
        androidx.test.espresso.NoActivityResumedException: No activities in stage RESUMED. Did you forget to launch the activity. (test.getActivity() or similar)?
        at dalvik.system.VMStack.getThreadStackTrace(Native Method)
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,权限在应用程序信息设置中显示为已授予,但在 api 版本 27(或更低版本)的模拟器上运行测试时仍然要求权限

有人可以确认这是否是某些 android 插件中的错误,或者我在这里遗漏了什么。

源代码- https://github.com/vivekweb2013/test-android-project

android android-fragments android-testing android-permissions androidx

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