我使用以下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 …
我想学习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
我有一个存储在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进行身份验证.哪个是有道理的.但这不是一个循环,不可能实现:
这有什么不对?
编辑:
我使用模拟器(Nexus …
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) 每当您调用.observe()LiveData 时,观察者都会收到该 LiveData 的最后一个值。这在某些情况下可能有用,但对我来说没有用。
每当我调用 时.observe(),我希望观察者只接收未来的 LiveData 更改,而不是.observe()调用时它所持有的值。
对于一个 LiveData 实例,我可能有多个观察者。我希望他们都能在发生 LiveData 更新时收到更新。
我希望每个 LiveData 更新仅被每个观察者使用一次。我认为这只是对第一个要求的重新表述,但我的头已经开始旋转,我对此不确定。
在谷歌搜索这个问题时,我发现了两种常见的方法:
将数据包装在 an 中LiveData<SingleEvent<Data>>并检查该类SingleEvent是否已被消耗。
如果观察者已经获得事件,则扩展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设计:
Repository.delete()RepositoryEvents。因此,当删除完成后,Repository 会通知 ViewModel,ViewModel 也会通知 ListFragment。
现在,当用户切换到第二个 ListFragment 时,会发生以下情况:
android android-lifecycle android-mvvm android-livedata android-architecture-components
我已经阅读了一些与此相关的问题或类似的错误消息(每个 {} 也会发生这种情况),但没有一个问题使我取得成功。
有关如何使其工作的任何提示或建议?
这是我的设置和单元测试本身:
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) 我有一个嵌套(!)片段,显示我的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();
}
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (mPhotoNoteDialogFragment != null) {
mPhotoNoteDialogFragment.show(getFragmentManager(), PhotoNoteDialogFragment.TAG);
}
}
在屏幕旋转后,这些尝试都不会使DialogFragment再次出现.有没有其他人的想法,我可以尝试下一步..?我没有想法.
谢谢
您如何使用 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
我正在使用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音频....对吗?任何人之前尝试过此或知道另一种稳定(!)方式:
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中添加).
PlacePicker是一个有用的小部件com.google.android.gms:play-services-places:9.4.0.在此处查找说明:PlacePicker
该文档明确指出您需要ACCESS_FINE_LOCATION权限才能使用它.
在Marshmallow及以上,您还必须要求用户授予此权限.
但它似乎没有做任何这个工作!
我的应用程序
但是在Marshmallow设备上运行应用程序会启动PlacePicker,我可以
任何人都可以确认这个或解释为什么这个小部件工作没有授予适当的权限?
android android-permissions google-maps-android-api-2 android-6.0-marshmallow
android ×10
unit-testing ×2
android-architecture-components ×1
android-mvvm ×1
audio ×1
gradle ×1
greendao ×1
kotlin ×1
mediacodec ×1
mockk ×1
nested ×1
robolectric ×1
wav ×1