我已阅读检测传出呼叫并在android中调用hangup事件
我想做一个应用程序来检测后台作为服务的呼叫事件,我想我应该选择BroadcastReceiver,因为即使我退出应用程序,应用程序也会保持检测呼叫.我认为停止检测呼叫的唯一方法是在使用BroadcastReceiver时卸载应用程序.
如果我选择PhoneStateListener,我认为如果我退出应用程序,应用程序将停止检测呼叫.
对?
谢谢!
我想写一个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) 通常,活动将显示最大屏幕.我希望显示一个宽度为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) 我知道我可以使用代码获取枚举成员的序号值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) 我创建一个项目,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) 我在 Android Studio 中安装 simpleUML 插件并添加项目类图。我觉得图太复杂了,大部分类包括系统自动生成的类都加了,即使我打开了自动布局也很难浏览,你可以看到图1。
1:我可以自定义simpleUML吗?我不希望将系统自动生成的类添加com.example.android.architecture.blueprints.todoapp.databinding.TaskItemBinding到图表中。
2:我希望只为data文件夹下的这些文件生成图表,我在文件夹data上右击选择Add to simpleUML Diagram(图2),但是我只添加了一个空白的类图,为什么?
该代码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) 录制音频是一个长时间的操作,所以我mRecorder?.start()在一个服务内的一个协程中启动,你可以看到RecordService.kt。
我祈求suspend fun startRecord(){...}在AndroidViewModel与viewModelScope.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) 以下代码来自官方示例项目。
有两个分支,main和end。
我发现代码主体和代码结尾使用不同的方式进行导航。
代码 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) 我在我的项目中使用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)