小编Har*_*ryS的帖子

在 Android 10 中启动活动时崩溃

在 Android 10 (SDK 29) 上运行我的应用程序(最低 SDK 21)时遇到问题。

应用程序的初始活动即将出现并按预期显示。现在,当按下按钮以在顶部显示第二个活动时,我看到此崩溃日志:

java.lang.IllegalStateException: Activity top position already set to onTop=false
    at android.app.ActivityThread.handleTopResumedActivityChanged(ActivityThread.java:4370)
    at android.app.servertransaction.TopResumedActivityChangeItem.execute(TopResumedActivityChangeItem.java:39)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
    at android.os.Handler.dispatchMessage(Handler.java:107)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7356)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Run Code Online (Sandbox Code Playgroud)

对于 SDK 29 以下的所有 Android 版本,第二个活动都可以正常启动。代码非常简单

    this.startActivity (new Intent (MyFirstActivity.this, MySecondActivity.class));
Run Code Online (Sandbox Code Playgroud)

关于可能触发此问题的任何提示以及异常(“活动顶部位置已设置为 onTop=false”)实际上告诉我的是什么?

为方便起见,这是 ActivityThread.java 代码:

@Override
public void handleTopResumedActivityChanged(IBinder token, boolean onTop, String reason) {
    ActivityClientRecord r = mActivities.get(token);
    if (r == null || r.activity == null) {
        Slog.w(TAG, …
Run Code Online (Sandbox Code Playgroud)

android

9
推荐指数
1
解决办法
4292
查看次数

使用带有MediaCodec的getInputImage进行编码

背景:我做视频文件解复用,解码视频轨道,对接收到的帧应用一些更改,再次解码和复用它们.

在Android中执行此操作的已知问题是供应商指定编码器/解码器颜色格式的数量.Android 4.3引入了表面以使设备独立,但我发现很难使用它们,因为我的帧更改例程需要Canvas写入.

自Android 5.0以来,使用灵活的YUV420颜色格式很有前途.与用于解码的getOutputImage和用于编码的getInputImage一起,Image对象可以用作从解码MediaCodec检索的格式.我使用getOutputImage进行解码工作,并可以在RGB转换后可视化结果.为了编码YUV图像并将其排队到MediaCodec(编码器),似乎缺少链接:

从MediaCodec中取出输入缓冲区后

int inputBufferId = encoder.dequeueInputBuffer (5000);
Run Code Online (Sandbox Code Playgroud)

我可以访问返回的正确图像

encoder.getInputImage (inputBufferId);
Run Code Online (Sandbox Code Playgroud)

我填写图像缓冲区 - 这也工作,但我没有看到一种方法将输入缓冲区排队回编解码器进行编码...只有一个

encoder.queueInputBuffer (inputBufferId, position, size, presentationUs, 0);
Run Code Online (Sandbox Code Playgroud)

方法可用,但没有任何匹配图像.可以使用检索呼叫所需的大小

ByteBuffer  byteBuffer = encoder.getInputBuffer (inputBufferId);
Run Code Online (Sandbox Code Playgroud)

byteBuffer.remaining ();
Run Code Online (Sandbox Code Playgroud)

但是除了getInputImage()之外,这似乎会在调用时搞砸编码器.

另一个缺少的文档或者我错了什么?

encoding android mediacodec

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

标签 统计

android ×2

encoding ×1

mediacodec ×1