【问题标题】:TextureView: Perform TextureView.getBitmap() in BackgroundTextureView:在后台执行 TextureView.getBitmap()
【发布时间】:2014-08-22 02:44:08
【问题描述】:

我在TextureView 中显示CameraView 并使用TextureView.getBitmap()TextureView 获取位图。

每次我调用TextureView.getBitmap() 时,都会导致相机预览冻结一纳秒。我想在后台运行这个任务。

谢谢

这是我尝试过的代码:

     findViewById(R.id.capture).setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View v) {
             Bitmap bmp =  mTextureView.getBitmap();  
             rev = new ArrayList<Bitmap>();
             rev.add(bmp);
             Toast.makeText(getApplicationContext(),""+ rev.size(), Toast.LENGTH_LONG).show();
           }
        });     

这是我的 Logcat

       08-22 03:59:57.867: E/AndroidRuntime(4859): FATAL EXCEPTION: main
        08-22 03:59:57.867: E/AndroidRuntime(4859): java.lang.NullPointerException
        08-22 03:59:57.867: E/AndroidRuntime(4859):     at                              com.example.hangout_gif_camera.MainActivity$1.onClick(MainActivity.java:41)
      08-22 03:59:57.867: E/AndroidRuntime(4859):   at            android.view.View.performClick(View.java:4211)
     08-22 03:59:57.867: E/AndroidRuntime(4859):    at       android.view.View$PerformClick.run(View.java:17446)
     08-22 03:59:57.867: E/AndroidRuntime(4859):    at   android.os.Handler.handleCallback(Handler.java:725)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at         android.os.Handler.dispatchMessage(Handler.java:92)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at android.os.Looper.loop(Looper.java:153)
     08-22 03:59:57.867: E/AndroidRuntime(4859):    at android.app.ActivityThread.main(ActivityThread.java:5297)
   08-22 03:59:57.867: E/AndroidRuntime(4859):  at java.lang.reflect.Method.invokeNative(Native Method)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at java.lang.reflect.Method.invoke(Method.java:511)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
    08-22 03:59:57.867: E/AndroidRuntime(4859):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
      08-22 03:59:57.867: E/AndroidRuntime(4859):   at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: java android bitmap camera textureview


    【解决方案1】:
     freeze for a nano second
    

    你甚至不会意识到它会冻住我们的眼睛,反应不那么快(除非你是超人)。

    但如果你真的希望它在单独的线程中运行,你可以试试这个:

    编辑:

    findViewById(R.id.capture).setOnClickListener(new OnClickListener() {
                   @Override
                   public void onClick(View v) {
                     Thread td = new Thread(new Runnable() {
                       public void run()
                       {
                             Bitmap bmp =  mTextureView.getBitmap();  
                             rev = new ArrayList<Bitmap>();
                             rev.add(bmp);
                             runOnUiThread(new Runnable() {
    
                                @Override
                                public void run() {
                                     Toast.makeText(getApplicationContext(),""+ rev.size(), Toast.LENGTH_LONG).show();
                                }
                            });
                       }
                     });
                     td.start(); //start the thread
    
                   }
                }); 
    

    【讨论】:

    • 它导致我的应用程序崩溃
    • @DonnieIbiyemi 你能发一下logcat吗
    • Rod_Algonquin 我刚刚发布了它
    • @DonnieIbiyemi 第 41 行是什么?
    • Rod_Algonquin 吐司消息
    【解决方案2】:

    您必须在主 UI 线程上触发 TextureView.getBitmap()。然后将Bitmap 传递给AsyncTask 并在那里完成剩下的工作。我就是这样做的,而且效果很好。

    如果您要捕获TextureView 的每一帧,请注意内存问题,例如来自MediaRecorder

    【讨论】:

    • 我发现在 Galaxy S5 上获取 1920x1080 位图大约需要 50 毫秒,这对于 UI 线程来说相当可观。半尺寸大约需要 15 毫秒,四分之一尺寸大约需要 5 毫秒。所以,这个解决方案有效(并且可能是唯一的选择),但我仍然认为它的性能不是很好。 ://
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多