小编Hel*_*oCW的帖子

当我需要在android中检测调用事件时,我应该在BroadcastReceiver和PhoneStateListener之间做什么选择?

我已阅读检测传出呼叫并在android中调用hangup事件

我想做一个应用程序来检测后台作为服务的呼叫事件,我想我应该选择BroadcastReceiver,因为即使我退出应用程序,应用程序也会保持检测呼叫.我认为停止检测呼叫的唯一方法是在使用BroadcastReceiver时卸载应用程序.

如果我选择PhoneStateListener,我认为如果我退出应用程序,应用程序将停止检测呼叫.

对?

谢谢!

android

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

使用静态var和传递对象参数之间哪一个更好?

我想写一个APP来记录屏幕,有两种方式,RecordHelper_Method_A和RecordHelper_Method_B.

在RecordHelper_Method_A中,我将mMediaRecorder,MediaProjection mMediaProjection和mVirtualDisplay定义为静态var,它很容易调用,例如StartRecord( mContext, requestCode, resultCode,data),StopRecord().

在RecordHelper_Method_B中,我需要在主Activity类中定义mMediaRecorder,MediaProjection mMediaProjection,并在调用时传递参数StartRecord(mMediaRecorder, mMediaProjection,mVirtualDisplay),'StopRecord(mMediaRecorder,mMediaProjection,mVirtualDisplay)`......,这有点复杂.

我不知道哪一个更好,而且当我结束APP时,我不知道是否可以在RecordHelper_Method_A中正确释放这些静态var.

顺便说一句,如果你有更好的方法,请告诉我吗?谢谢!

RecordHelper_Method_A

public class RecordHelper_Method_A {

    private static MediaRecorder mMediaRecorder;
    private static MediaProjection mMediaProjection;
    private static VirtualDisplay mVirtualDisplay;

    public static void StartRecord(Context mContext,int requestCode, int resultCode, Intent data){

        mMediaRecorder = new MediaRecorder();
        initRecorder();

        MediaProjectionManager mProjectionManager = (MediaProjectionManager) mContext.getSystemService(Context.MEDIA_PROJECTION_SERVICE);
        mMediaProjection = mProjectionManager.getMediaProjection(resultCode, data);

        mVirtualDisplay=mMediaProjection.createVirtualDisplay("MainActivity",
                400,600, 300,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                mMediaRecorder.getSurface(), null, null);

        MediaProjectionCallback mMediaProjectionCallback = new MediaProjectionCallback();
        mMediaProjection.registerCallback(mMediaProjectionCallback, null);

        mMediaRecorder.start();
    }

    public static void StopRecord(){
        mMediaProjection=null;
        mMediaRecorder.stop(); …
Run Code Online (Sandbox Code Playgroud)

java android

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

我可以在Android Studio 3.0中设计自定义尺寸活动吗?

通常,活动将显示最大屏幕.我希望显示一个宽度为400px,高度为500px的窗口,但是下面仍然显示一个完整的窗口,为什么?

主要活动

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
Run Code Online (Sandbox Code Playgroud)

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="400px"
        android:layout_height="500px"
        tools:context=".MainActivity">

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Hello World OK!"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintLeft_toLeftOf="parent"
            app:layout_constraintRight_toRightOf="parent"
            app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>
Run Code Online (Sandbox Code Playgroud)

到克柳月

谢谢!但是你的代码不起作用,运行代码后窗口全屏显示.

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val m = windowManager
        val d = m.defaultDisplay
        val p = window.attributes
        p.height = dp2px(this, 500f)
        p.width = dp2px(this, 400f)
        window.attributes = p

    }

    private fun dp2px(context: Context, …
Run Code Online (Sandbox Code Playgroud)

android

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

如何通过 kotlin 中的序数值获得枚举成员?

我知道我可以使用代码获取枚举成员的序号值Color.BLUE.ordinal

现在我希望在知道枚举成员的序号值时得到 Color.Green,我该怎么办?

代码

enum class Color{
    RED,BLACK,BLUE,GREEN,WHITE
}



var aOrdinal=Color.BLUE.ordinal //it's 2

val bOrdinal=3  //How can I get Color.Green
Run Code Online (Sandbox Code Playgroud)

android kotlin

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

当我在Android Studio 3.4.1中从Github克隆项目时,为什么build.gradle(项目)消失了?

我创建一个项目,build.gradle(Project)和build.gradle(Module)都在Android文件夹结构中正常列出,看起来像Old Image 1,然后将项目同步到Android Studio 3.4.1中的远程GitHub。

我从另一台PC上的GitHub克隆了项目,发现build.gradle(Project)在另一台PC上的Android文件夹结构中消失了,看起来像New Image 1,但是我可以在Project文件夹结构中找到,看起来像New Image 2。为什么?顺便说一句,克隆项目可以很好地工作。

似乎Github引起了问题,我该如何解决?谢谢!

旧图1

在此处输入图片说明

新形象1

在此处输入图片说明

新形象2

在此处输入图片说明

要InsurgentPointerException:

这是项目级别的build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {

    ext.kotlin_version = '1.3.40'
    ext.anko_version = '0.10.8'

    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    } …
Run Code Online (Sandbox Code Playgroud)

github gradle android-studio

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

我可以在 Android Studio 3.6.2 中自定义 simpleUML 吗?

我在 Android Studio 中安装 simpleUML 插件并添加项目类图。我觉得图太复杂了,大部分类包括系统自动生成的类都加了,即使我打开了自动布局也很难浏览,你可以看到图1。

1:我可以自定义simpleUML吗?我不希望将系统自动生成的类添加com.example.android.architecture.blueprints.todoapp.databinding.TaskItemBinding到图表中。

2:我希望只为data文件夹下的这些文件生成图表,我在文件夹data上右击选择Add to simpleUML Diagram(图2),但是我只添加了一个空白的类图,为什么?

图 1 在此处输入图片说明

图 2 在此处输入图片说明

android-studio

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

为什么作者将localCacheBillingClient设计为lateinit?

代码A是从项目play-billing-samples,你可以看到

不知道为什么作者设计localCacheBillingClient成这样lateinit,导致代码有点复杂,if (::localCacheBillingClient.isInitialized == false) {...}被调用了很多次。

我认为代码 B可以很好地工作,对吗?

代码 A

class BillingRepository private constructor(private val application: Application) :
        PurchasesUpdatedListener, BillingClientStateListener {

     lateinit private var localCacheBillingClient: LocalBillingDb


    val subsSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
        if (::localCacheBillingClient.isInitialized == false) {
            localCacheBillingClient = LocalBillingDb.getInstance(application)
        }
        localCacheBillingClient.skuDetailsDao().getSubscriptionSkuDetails()
    }

    val inappSkuDetailsListLiveData: LiveData<List<AugmentedSkuDetails>> by lazy {
        if (::localCacheBillingClient.isInitialized == false) {
            localCacheBillingClient = LocalBillingDb.getInstance(application)
        }
        localCacheBillingClient.skuDetailsDao().getInappSkuDetails()
    }

   fun startDataSourceConnections() {
        Log.d(LOG_TAG, "startDataSourceConnections")
        instantiateAndConnectToPlayBillingService() …
Run Code Online (Sandbox Code Playgroud)

kotlin

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

如果我在 Android 中以挂起乐趣启动 MediaRecorder.start() 并以正常乐趣启动 MediaRecorder.stop() 会导致错误吗?

录制音频是一个长时间的操作,所以我mRecorder?.start()在一个服务内的一个协程中启动,你可以看到RecordService.kt。

我祈求suspend fun startRecord(){...}AndroidViewModelviewModelScope.launch { }开始录制音频。

我只调用一个正常的fun stopRecord(){...}inAndroidViewModel来停止录制音频,你可以看到HomeViewModel.kt,它会导致对象出错var mRecorder: MediaRecorder?吗?

HomeViewModel.kt

class HomeViewModel(val mApplication: Application, private val mDBVoiceRepository: DBVoiceRepository) : AndroidViewModel(mApplication) {

    private var mService: RecordService? = null

    private val serviceConnection = object : ServiceConnection {
        override fun onServiceConnected(className: ComponentName, iBinder: IBinder) {
            val binder = iBinder as RecordService.MyBinder
            mService = binder.service
        }
       ...
    }


    fun bindService() {
        Intent(mApplication , RecordService::class.java).also { intent ->
            mApplication.bindService(intent, serviceConnection, …
Run Code Online (Sandbox Code Playgroud)

android android-service kotlin-coroutines

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

Jetpack Compose Navigation 的导航设计是否良好?

以下代码来自官方示例项目

有两个分支,mainend

我发现代码主体代码结尾使用不同的方式进行导航。

代码 main简单明了,在其他项目中,它基于 State 进行导航,就像来自项目的代码 A一样

代码端用来导航,但是我们使用Jetpack Compose的时候NavHostController好像就不用再用了吧?Navigation

代码主要

@Composable
fun RallyApp() {
    RallyTheme {
        val allScreens = RallyScreen.values().toList()
        var currentScreen by rememberSaveable { mutableStateOf(RallyScreen.Overview) }
        Scaffold(
          ...
        ) { innerPadding ->
            Box(Modifier.padding(innerPadding)) {
                currentScreen.content(
                    onScreenChange = { screen ->
                        currentScreen = RallyScreen.valueOf(screen)
                    }
                )
            }
        }
    }
}

enum class RallyScreen(
    val icon: ImageVector,
    val body: @Composable ((String) -> Unit) …
Run Code Online (Sandbox Code Playgroud)

kotlin android-jetpack-navigation android-jetpack-compose

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

为什么使用 Hilt 将 Context 注入 ViewModel 会导致错误“无法解析”?

我在我的项目中使用hilt_version = '2.41',我已阅读该文章

我希望注入Context,所以我根据那篇文章ViewModel写了Code A。

当我编译代码A时,我得到结果A,我该如何解决这个问题?

代码A

@HiltViewModel
class SoundViewModel @Inject constructor(
    @ApplicationContext private val mContext: Context  
): ViewModel() {
   ...
}


@HiltAndroidApp
class UIApp : Application() {

}

implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha03'
kapt 'androidx.hilt:hilt-compiler:1.0.0'
Run Code Online (Sandbox Code Playgroud)

结果A

Task :app:hiltJavaCompileFreeDebug
: ComponentProcessingStep was unable to process 'info.dodata.soundmeter.presentation.UIApp_HiltComponents.SingletonC' because 'dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory' could not be resolved.
  
  Dependency trace:
      => element (CLASS): androidx.hilt.lifecycle.ViewModelFactoryModules.ActivityModule
      => element (METHOD): provideFactory(android.app.Activity,android.app.Application,java.util.Map<java.lang.String,javax.inject.Provider<androidx.hilt.lifecycle.ViewModelAssistedFactory<? extends androidx.lifecycle.ViewModel>>>)
      => annotation: @dagger.hilt.android.internal.lifecycle.DefaultActivityViewModelFactory
      => type (ERROR …
Run Code Online (Sandbox Code Playgroud)

android dagger-hilt

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