小编mue*_*flo的帖子

仅使用Proguard:无法初始化DaoConfig => ArrayIndexOutOfBoundsException

我使用以下ProGuard规则:

-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { *; }
-keep class **$Properties

-keep class org.greenrobot.greendao.**
-keepclassmembers class org.greenrobot.greendao.** { *; }

# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**

# If you do not use RxJava:
-dontwarn rx.**

启动应用程序时,我收到以下崩溃日志:

java.lang.RuntimeException: Unable to create application my.app.package.MyApplication: org.greenrobot.greendao.DaoException: Could not init DAOConfig
   at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4569)
   at android.app.ActivityThread.access$1500(ActivityThread.java:148)
   at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
   at android.os.Handler.dispatchMessage(Handler.java:102)
   at android.os.Looper.loop(Looper.java:135)
   at android.app.ActivityThread.main(ActivityThread.java:5272)
   at java.lang.reflect.Method.invoke(Native Method)
   at java.lang.reflect.Method.invoke(Method.java:372)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
Caused by: org.greenrobot.greendao.DaoException: Could not init DAOConfig
   at …

android greendao greendao-generator android-proguard

19
推荐指数
3
解决办法
1592
查看次数

用于Marshmallow PermissionHelper的Android Robolectric单元测试

我想学习Robolectric用于Android Marshmallow应用程序的单元测试.我写了PermissionHelper一些方法来使权限处理更容易一些.为了开始这个类的单元测试,我试图测试最简单的方法:

public static boolean hasPermissions(Activity activity, String[] permissions) {
    for (String permission : permissions) {
        int status = ActivityCompat.checkSelfPermission(activity, permission);
        if (status == PackageManager.PERMISSION_DENIED) {
            return false;
        }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止写的Robolectric测试:

@RunWith(RobolectricTestRunner.class)
@Config(constants = BuildConfig.class)
public class PermissionHelperTest {

    private PermissionHelper permissionHelper;
    private ShadowApplication application;

    @Before
    public void setup() {
        PictureActivity activity = Robolectric.buildActivity(PictureActivity.class).get();
        permissionHelper = new PermissionHelper(activity, activity, 1);
        application = new ShadowApplication();
    }

    @Test
    public void testHasPermission() throws Exception {
        String[] permissions = …
Run Code Online (Sandbox Code Playgroud)

android unit-testing robolectric android-permissions android-6.0-marshmallow

13
推荐指数
3
解决办法
5078
查看次数

FingerprintManager.authenticate()期间的UserNotAuthenticatedException

我有一个存储在Android KeyStore中的加密密码.

我想通过使用指纹API对用户进行身份验证来解密该密码.

据我了解,我必须调用该FingerprintManager.authenticate(CryptoObject cryptoObject)方法开始侦听指纹结果.CryptoObject参数创建如下:

public static Cipher getDecryptionCipher(Context context) throws KeyStoreException {
    try {
        Cipher cipher = Cipher.getInstance(TRANSFORMATION);
        SecretKey secretKey = getKeyFromKeyStore();
        final IvParameterSpec ivParameterSpec = getIvParameterSpec(context);

        cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec);
        return cipher;

    } catch (NoSuchAlgorithmException | NoSuchPaddingException | IOException | UnrecoverableKeyException | CertificateException | InvalidAlgorithmParameterException | InvalidKeyException e) {
        e.printStackTrace();

    }

    return null;
}

Cipher cipher = FingerprintCryptoHelper.getDecryptionCipher(getContext());
FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher);
fingerprintManager.authenticate(cryptoObject, ...);
Run Code Online (Sandbox Code Playgroud)

该方法getDecryptionCipher()cipher.init()呼叫之前正常工作.在这个调用中,我得到一个UserNotAuthenticatedException,因为用户没有为此secretKey进行身份验证.哪个是有道理的.但这不是一个循环,不可能实现:

  • 要验证用户身份,我想使用他/她的指纹
  • 要收听他/她的指纹,我需要初始化Cipher,而Cipher需要一个经过身份验证的用户

这有什么不对?

编辑:

我使用模拟器(Nexus …

android android-fingerprint-api

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

Android Studio无法找到我的资源

Android Studio无法编译我的测试项目,因为它无法解析资源.我在gradle.build中为res目录尝试了一些不同的设置,但没有任何效果.我错过了一些简单的东西吗?这是一个简单的HelloWorld项目,没有任何个人内容.

我有以下项目结构,因为它是由Android Studio向导创建的(最新版本0.2.5):

在此输入图像描述

在我的AndroidManifest.xml中有通常的应用程序名称引用:@ string/app_name此字符串在main/res/values/strings.xml中定义(在上面的屏幕截图中选择).

我从IDE(Android Studio)得到的错误是:

android-apt-compiler: [MyApplicationProject] C:\...\MyApplication\src\main\AndroidManifest.xml:6: error: 
Error: No resource found that matches the given name (at 'label' with value '@string/app_name').
Run Code Online (Sandbox Code Playgroud)

我运行"gradle tasks"时从命令行获得的错误是:

A problem occurred configuring root project 'MyApplicationProject'.
 > Failed to notify project evaluation listener.
    > Main Manifest missing from C:\...\MyApplicationProject\src\main\AndroidManifest.xml
Run Code Online (Sandbox Code Playgroud)

android gradle android-gradle-plugin

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

让每个观察者仅在订阅/观察时接收*新的LiveData

每当您调用.observe()LiveData 时,观察者都会收到该 LiveData 的最后一个值。这在某些情况下可能有用,但对我来说没有用。

  1. 每当我调用 时.observe(),我希望观察者只接收未来的 LiveData 更改,而不是.observe()调用时它所持有的值。

  2. 对于一个 LiveData 实例,我可能有多个观察者。我希望他们都能在发生 LiveData 更新时收到更新。

  3. 我希望每个 LiveData 更新仅被每个观察者使用一次。我认为这只是对第一个要求的重新表述,但我的头已经开始旋转,我对此不确定。


在谷歌搜索这个问题时,我发现了两种常见的方法:

  1. 将数据包装在 an 中LiveData<SingleEvent<Data>>并检查该类SingleEvent是否已被消耗。

  2. 如果观察者已经获得事件,则扩展MediatorLiveData并使用查找映射

这些方法的示例可以在这里找到: https://gist.github.com/JoseAlcerreca/5b661f1800e1e654f07cc54fe87441af#gistcomment-2783677 https://gist.github.com/hadilq/f095120348a6a14251a02aca329f1845#file-liveevent-kt https://gist .github.com/JoseAlcerreca/5b661f1800e1e654f07cc54fe87441af#file-event-kt

不幸的是,这些例子都不能满足我的所有要求。大多数时候,问题是任何新的观察者在订阅时仍然收到最后的 LiveData 值。这意味着每当用户在屏幕之间导航时,已经显示的 Snackbar 就会一次又一次地显示。


为了让您了解我正在谈论的内容/我正在编码的内容:

我遵循Android架构组件的LiveData MVVM设计:

  • 2 ListFragment 显示条目列表。
  • 他们使用同一 ViewModel 类的 2 个实例来观察与 UI 相关的 LiveData。
  • 用户可以删除此类 ListFragment 中的条目。删除是通过 ViewModel 调用完成的Repository.delete()
  • ViewModel 观察 的存储库RepositoryEvents

因此,当删除完成后,Repository 会通知 ViewModel,ViewModel 也会通知 ListFragment。

现在,当用户切换到第二个 ListFragment 时,会发生以下情况:

  • 创建第二个 …

android android-lifecycle android-mvvm android-livedata android-architecture-components

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

Kotlin Mockk 错误:在 verify { ... } 块中缺少调用

我已经阅读了一些与此相关的问题或类似的错误消息(每个 {} 也会发生这种情况),但没有一个问题使我取得成功。

有关如何使其工作的任何提示或建议?

这是我的设置和单元测试本身:

compileSdkVersion 29
defaultConfig {
   minSdkVersion 19
   targetSdkVersion 29
   testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

MockK version: 1.9.3.kotlin12
OS: Android
Kotlin version: 1.3.61
JDK version: jdk1.8.0_212
JUnit version: 4.12
Type of test: unit test
Run Code Online (Sandbox Code Playgroud)

错误的堆栈跟踪:

io.mockk.MockKException: Missing calls inside verify { ... } block.

    at io.mockk.impl.recording.states.VerifyingState.checkMissingCalls(VerifyingState.kt:52)
    at io.mockk.impl.recording.states.VerifyingState.recordingDone(VerifyingState.kt:21)
    at io.mockk.impl.recording.CommonCallRecorder.done(CommonCallRecorder.kt:47)
    at io.mockk.impl.eval.RecordedBlockEvaluator.record(RecordedBlockEvaluator.kt:60)
    at io.mockk.impl.eval.VerifyBlockEvaluator.verify(VerifyBlockEvaluator.kt:30)
    at io.mockk.MockKDsl.internalVerify(API.kt:118)
    at io.mockk.MockKKt.verify(MockK.kt:139)
    at io.mockk.MockKKt.verify$default(MockK.kt:136)
Run Code Online (Sandbox Code Playgroud)

我的单元测试:

@Test
fun logout_clearsDatabase() {
    coroutineTestRule.testDispatcher.runBlockingTest {

        // ARRANGE
        database.dataDao().insert(listOf(DataDummies()))

        // ACT
        sut.logout()

        // ASSERT
        verify { database.clearAllTables() } …
Run Code Online (Sandbox Code Playgroud)

android unit-testing kotlin android-testing mockk

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

嵌套的DialogFragment在轮换后被解雇

我有一个嵌套(!)片段,显示我的PhotoNoteDialogFragment:

private void newPhotoNote() {
  mPhotoDialog = PhotoNoteDialogFragment.newInstance(this);
  mPhotoDialog.show(getFragmentManager(), PhotoNoteDialogFragment.TAG);
}
Run Code Online (Sandbox Code Playgroud)

弹出对话框,但一旦旋转设备就会被解除.我做过一些研究并尝试过这些事情但没有成功:

  • 设置PhotoNoteDialogFragment#setRetainInstance(true).不起作用,因为无法保留嵌套的片段.

  • 在PhotoNoteDialogFragment中使用此代码段可防止从系统发出不需要的解除调用的错误:

    @Override
    public void onDestroyView() {
        if (getDialog() != null)
            getDialog().setDismissMessage(null);
        super.onDestroyView();
    }
  • 尝试调用show() - 我的嵌套片段#onActivityCreated中的方法,如果PhotoNoteDialogFragment的实例不是null:
  @Override
  public void onActivityCreated(final Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if (mPhotoNoteDialogFragment != null) {
      mPhotoNoteDialogFragment.show(getFragmentManager(), PhotoNoteDialogFragment.TAG);
    }
  }

在屏幕旋转后,这些尝试都不会使DialogFragment再次出现.有没有其他人的想法,我可以尝试下一步..?我没有想法.

谢谢

android nested screen-rotation android-dialogfragment

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

androidx 数据绑定与 Spinner 和自定义对象

您如何使用 androidx 数据绑定库用自定义对象列表(app:entries)填充 Spinner ?以及如何为 Spinner (app:onItemSelected)创建正确的选择回调?

我的布局:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">

<data>

    <variable
        name="viewModel"
        type=".ui.editentry.EditEntryViewModel" />
</data>

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ui.editentry.EditEntryActivity">

        <Spinner
            android:id="@+id/spClubs"
            android:layout_width="368dp"
            android:layout_height="25dp"
            app:entries="@{viewModel.projects}"
            app:onItemSelected="@{viewModel.selectedProject}"
             />

</FrameLayout>

</layout>
Run Code Online (Sandbox Code Playgroud)

编辑EntryViewModel.kt

class EditEntryViewModel(repository: Repository) : ViewModel() {

    /** BIND SPINNER DATA TO THESE PROJECTS **/
    val projects : List<Project> = repository.getProjects()

    /** BIND SELECTED PROJECT TO THIS VARIABLE **/
    val selectedProject: Project;
}
Run Code Online (Sandbox Code Playgroud)

项目.kt

data class Project(
    var id: Int? = null,
    var name: String = …
Run Code Online (Sandbox Code Playgroud)

android android-spinner android-databinding android-viewmodel

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

与wav文件一起使用时,MediaExtractor会抛出IllegalArgumentException

我正在使用Android MediaExtractor,如下所示:

MediaExtractor extractor = new MediaExtractor();
extractor.setDataSource("path/to/my/wav/file.wav");
extractor.selectTrack(0);

ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferIndex);
int sampleSize =  extractor.readSampleData(inputBuffer, 0);
Run Code Online (Sandbox Code Playgroud)

inputBuffer由MediaCodec提供,它被配置为AAC编码器.目标是将wave文件转换为aac.当然,上面的代码是缩写的,但我将错误跟踪到最后一行.

它也只在将MediaExtractor与wav文件一起使用时才会出现.例如,我使用.m4a代替,一切正常.

MediaExtractor的文档说:

MediaExtractor有助于从数据源中提取解复用的,通常编码的媒体数据.

"通常编码"并不排除未编码的PCM音频....对吗?任何人之前尝试过此或知道另一种稳定(!)方式:

  • 从wav中提取音频样本(不包括44byte或46byte标头)?
  • 在Android上将wav文件转换为aac?

UPDATE

这是logcat:

W/System.err: java.lang.IllegalArgumentException
W/System.err:     at android.media.MediaExtractor.readSampleData(Native Method)
W/System.err:     at com.myproject.android.audiosandbox.convert.MediaEncoder2.encodeLollipopStyle(MediaEncoder2.java:247)
W/System.err:     at com.myproject.android.audiosandbox.convert.MediaEncoder2.encodeSong(MediaEncoder2.java:119)
W/System.err:     at com.myproject.android.audiosandbox.convert.MediaEncoder2.encode(MediaEncoder2.java:70)
W/System.err:     at com.myproject.android.audiosandbox.fragments.AudioConvertFragment$1.onClick(AudioConvertFragment.java:40)
W/System.err:     at android.view.View.performClick(View.java:4763)
W/System.err:     at android.view.View$PerformClick.run(View.java:19821)
W/System.err:     at android.os.Handler.handleCallback(Handler.java:739)
W/System.err:     at android.os.Handler.dispatchMessage(Handler.java:95)
W/System.err:     at android.os.Looper.loop(Looper.java:135)
W/System.err:     at android.app.ActivityThread.main(ActivityThread.java:5272)
W/System.err:     at java.lang.reflect.Method.invoke(Native Method)
W/System.err:     at java.lang.reflect.Method.invoke(Method.java:372)
W/System.err:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
Run Code Online (Sandbox Code Playgroud)

我使用的是API 16,因此MediaMuxer不是一个选项(在API 18中添加).

audio android wav mediacodec mediaextractor

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

为什么Android PlacePicker不是(!)需要ACCESS_FINE_LOCATION权限才能工作?

PlacePicker是一个有用的小部件com.google.android.gms:play-services-places:9.4.0.在此处查找说明:PlacePicker

该文档明确指出您需要ACCESS_FINE_LOCATION权限才能使用它.

在Marshmallow及以上,您还必须要求用户授予此权限.
但它似乎没有做任何这个工作!
我的应用程序

  • 提供地图API密钥
  • 没有在AndroidManifest中定义权限
  • 要求用户随时授予此权限

但是在Marshmallow设备上运行应用程序会启动PlacePicker,我可以

  • 正确选择一个地方(没有API密钥就不可能).
  • 通过MyLocation-Button转到"我的位置"(可能没有API密钥)

任何人都可以确认这个或解释为什么这个小部件工作没有授予适当的权限?

android android-permissions google-maps-android-api-2 android-6.0-marshmallow

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