小编u2g*_*les的帖子

Android N - 下载管理器通知取消按钮

Android N 在下载管理器通知中有一个新的取消按钮。

我想在我的应用程序中执行一些代码,以在用户按下此按钮时停止进度条。如果有的话,调用哪个方法?

另请注意,意图过滤器操作 DownloadManager.ACTION_NOTIFICATION_CLICKED 仅在用户单击通知本身时触发,而不是在他/她单击“取消”按钮时触发。

 if_downloadManager = new IntentFilter();
    if_downloadManager.addAction(DownloadManager.ACTION_DOWNLOAD_COMPLETE);
    if_downloadManager.addAction(DownloadManager.ACTION_NOTIFICATION_CLICKED);

    br_downloadManager = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();

            if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) {
                ....
            }

            if (DownloadManager.ACTION_NOTIFICATION_CLICKED.equals(action)) {
                // This code is not executed when the user presses the Cancel Button in the Download Manager Notification
            }       
        }
    };
Run Code Online (Sandbox Code Playgroud)

提前致谢。

android cancel-button android-notifications android-download-manager

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

Android - 带音频焦点的 SimpleExoPlayer

我使用 SimpleExoPlayer 实现了一个测试应用程序,效果很好。我现在想将音频焦点添加到我的应用程序中。

当用户启动应用程序时开始使用音频焦点播放很容易。在 onCreate() 末尾添加常用代码:

        if (AudioManager.AUDIOFOCUS_REQUEST_GRANTED == audioManager.requestAudioFocus(...
Run Code Online (Sandbox Code Playgroud)

工作正常。

但是当用户按下播放按钮时,我无法请求音频焦点,这是我记得的 PlaybackControlView 封装的。

换句话说,使用SimpleExoPlayer和SimpleExoPlayerView(PlaybackControlView)时如何捕获播放按钮单击事件?

重新定义 simpleExoPlayer.setPlayWhenReady() 似乎不可能,因为 SimpleExoPlayer 的实例是由 Factory 给出的,而不是使用 new 关键字实例化的。

simpleExoPlayer = ExoPlayerFactory.newSimpleInstance(...)
Run Code Online (Sandbox Code Playgroud)

除了使用播放按钮解决这个问题之外,还有其他想法吗?提前致谢。

更新(17/02/17):

github.com/google/ExoPlayer 上的此问题被标记为“增强”。 这里

他们的第一个回答是:

您可以通过向 ExoPlayer 实例 (ExoPlayer.addListener) 添加侦听器并实现侦听器的 onPlayerStateChanged 以根据需要获取或释放音频焦点来实现此目的。请注意,每当 playWhenReady 发生更改时,都会调用 onPlayerStateChanged。

这个解决方案的小问题是 onPlayerStateChanged() 在音频/视频开始播放之后调用,而不是之前。我实现了它,当两个音频同时播放时,非常短的重叠从耳朵中当然是察觉不到的。因此,如果您需要的话,它可以被认为是一个很好的解决方案。当 ExoPlayer 团队提供更好的解决方案时,我会通知您。

audio android android-audiomanager exoplayer

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

ViewModel中的实例成员LiveData变量?

在Android上中断两年后,我试图了解Android体系结构组件。在阅读官方文档和一些博客后,令我困惑的一件事是在哪里创建LiveData变量。

在下面的第一个变体中,我仅在存储库类中创建了一个livedata变量,而在存储库和View模型类的第二个变体中创建了一个livedata变量。两种变体均有效。

第一个变体:

public class ScoreViewModel extends AndroidViewModel {

    private ScoreRepositorDB scoreRepo;

    public ScoreViewModel(Application application) {
        super(application);
        scoreRepo = new ScoreRepositorDB(application);
    }

    public LiveData<Score> getScore(){
        return scoreRepo.getScore();   
    }
    ...
 }
Run Code Online (Sandbox Code Playgroud)

第二个变体:

public class ScoreViewModel extends AndroidViewModel {

    private ScoreRepositorDB scoreRepo;
    private LiveData<Score> score ;

    public ScoreViewModel(Application application) {
        super(application);
        scoreRepo = new ScoreRepositorDB(application);
        score =  scoreRepo.getScore();
    }

    public LiveData<Score> getScore(){
       // return scoreRepo.getScore();
       return score;

    }
    ...
  }
Run Code Online (Sandbox Code Playgroud)

两种版本的存储库:

private LiveData<Score> score ;

ScoreRepositorDB(Application application) {
    ScoreRoomDatabase db = ScoreRoomDatabase.getDatabase(application); …
Run Code Online (Sandbox Code Playgroud)

android mvvm android-room android-livedata android-viewmodel

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

Google-Colaboratory - 如何刷新 google-drive?

我正在使用 google-colaboratory GPU 来训练神经网络模型。我的 python/pytorch 代码存储在 google-drive 中。我能够在协作和训练模型中安装我的驱动器。但是,即使重新启动我的电脑并重新启动后,“我的驱动器”中的任何 python 代码更改也不会更新到 google-colaboratory。

为了清除谷歌合作实验室缓存,我尝试过:

!google-drive-ocamlfuse -cc
Run Code Online (Sandbox Code Playgroud)

但它不起作用:

/bin/bash: google-drive-ocamlfuse: command not found
Run Code Online (Sandbox Code Playgroud)

如何清理此缓存并避免在 google-colaboratory 考虑我的代码之前等待数小时?提前致谢

PS:我使用的挂载方法:

from google.colab import drive
drive.mount('/content/drive/')
Run Code Online (Sandbox Code Playgroud)

mount drive google-colaboratory

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

Pycharm - 禁用'局部变量'xxx'可能在赋值之前被引用'

在 pycharm 中,我想禁用以下检查警告:“局部变量 'xxx' 可能在赋值之前被引用”,但我在设置/检查中找不到它。

PS:这不是重复的,因为我理解这个警告。我只是问如何在 pycharm 中禁用它。

更新:请在下面找到我的意思的例子

cond = True
def add1(x):
    return x+1
if cond:
    a = 1
if cond:
    b = add1(a) # the warn is on the 'a'
Run Code Online (Sandbox Code Playgroud)

解决方案:

“未绑定局部变量”检​​查。(参见下面的 Lomtrur 回答)

python warnings pycharm intellij-inspections

5
推荐指数
2
解决办法
1627
查看次数

Android - 如何让recyclerview ListAdpater停止闪烁?

我有一个回收器视图,其适配器使用 ListAdapter (版本 1.1.0):

class InnerEpisodeFragmentAdapter(
    private val actCtx: Context,
) : ListAdapter<Episode, InnerEpisodeFragmentAdapter.MViewHolder>(COMPARATOR) {
...
Run Code Online (Sandbox Code Playgroud)

回收器视图由来自 Room 数据库 Episode 表的 kotlin 流提供:

vm.episodesFlow().asLiveData().observe(viewLifecycleOwner) { episodes ->
  episodes.let { adapter.submitList(it) }
}

@Query("SELECT * FROM Episode ORDER BY pubDate DESC")
fun episodesFlow(): Flow<List<Episode>>
Run Code Online (Sandbox Code Playgroud)

例外的是,每次剧集表中的元组发生更改时,都会发出新的剧集列表并更新回收器视图。

它工作正常,但每次更新时都会出现可怕的闪烁。它给用户带来了糟糕的体验。

当流发出新值时如何避免这种闪烁?

在我的应用程序的先前版本中,我使用了像notifyDataSetChanged()或notifyItemChanged()这样从不闪烁的函数。我知道我仍然可以尝试使用这些函数,但如果我在使用kotlin时无法避免闪烁,我会非常失望流程如上图。谢谢。

android android-recyclerview android-listadapter kotlin-flow

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

Python - Get the source code of the line that called me

Using the python inspect module, in a function, I would like to get the source code of the line that called that function.

So in the following situation:

def fct1():
    # Retrieve the line that called me and extract 'a'
    return an object containing name='a'

a = fct1()
Run Code Online (Sandbox Code Playgroud)

I would like to retrieve the string "a = fct1()" in fct1

All I can do so far is to retrieve the code of the whole module with :

code = inspect.getsource(sys._getframe().f_back) …
Run Code Online (Sandbox Code Playgroud)

python inspect

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

Android设计库TabLayout背景问题

当我设置"22.2.0 Android设计库"TabLayout(android.support.design.widget.TabLayout)的tabBackground属性时,会出现两个问题:

  • 选项卡中的涟漪效应会丢失
  • 标签指示消失.

这在Lollipop和Kitkat设备上都会发生.

如果没有tabBackground设置,涟漪效果和制表符指示都会起作用,但背景的默认颜色与工具栏不同,这与材料设计指南不完全一致.

请在下面找到XML:

 <android.support.design.widget.TabLayout
        android:id="@+id/tabLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:tabMode="fixed"
        app:tabGravity="fill"
        app:tabBackground = "?attr/colorPrimary" />
Run Code Online (Sandbox Code Playgroud)

android ripple android-design-library

4
推荐指数
1
解决办法
2846
查看次数

Android - 如何从 kotlin 流程中读取值?

我有一个房间数据库中的剧集流。我可以毫无问题地将这个流程作为实时数据进行观察。

但我也想在用户单击按钮时读取此流程中的最后一个值。我尝试使用 first() 终端流运算符,但它无法编译。你能帮忙或提出其他建议吗?

从流中读取的非编译尝试:

bd.buttonNext.setOnClickListener {
    lifecycleScope.launch {
        val episode: Episode? = viewModel.episodeFlow().first()           <=== Compile ERROR
        Snackbar.make(bd.root, "episode ${episode?.name}", Snackbar.LENGTH_SHORT).show()
    }
}
Run Code Online (Sandbox Code Playgroud)

此流程来自 ROOM :

@Query("SELECT * FROM Episode WHERE id = :id")
fun getEpisode(id: Long): Flow<Episode?>
Run Code Online (Sandbox Code Playgroud)

存储库:

fun getEpisode(episodeId: Long): Flow<Episode?> = dao.getEpisode(episodeId)
Run Code Online (Sandbox Code Playgroud)

视图模型 - Id 来自 StateFlow :

fun episodeFlow(): Flow<Episode?> 
  = episodeIdStateFlow.flatMapLatest { episodeId ->
    repository.getEpisode(episodeId)
  }
Run Code Online (Sandbox Code Playgroud)

编译错误:

Unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
public fun <T> Array<out …
Run Code Online (Sandbox Code Playgroud)

android kotlin-flow kotlin-coroutines-flow kotlin-stateflow

4
推荐指数
1
解决办法
1028
查看次数

Android R – 使用 Scoped 存储 (MediaStore.Downloads) 在下载文件夹中创建一个文本文件

我的应用程序需要在下载文件夹中的文本文件中保存一个字符串。目前(目标:API 29 (Q) 我正在使用 FILE API 和:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
android:requestLegacyExternalStorage="true"
Run Code Online (Sandbox Code Playgroud)

但是对于 API 30 (R),如果我理解得很好,我必须将其迁移到作用域存储 (MediaStore.Downloads)。

在这里,我有点失落。我在下载中找不到显示如何创建文本文件的好的文档或片段。如果有人可以解释或展示如何做到这一点,我会很高兴吗?

android mediastore scoped-storage

3
推荐指数
1
解决办法
3403
查看次数