簡體   English   中英

ANDROID App在第二次打開時關閉,第一次打開時運行良好

[英]ANDROID App shuts down on opening the second time, works fine while opening the first time

關於應用程序:

我正在嘗試使用UI中的切換按鈕制作一個簡單的手電筒應用程序。 因為即使在應用程序最小化的情況下,我也希望手電筒保持打開狀態,所以我在onClick()事件中打開釋放了相機。

問題:

  • 我的應用程序在首次打開時可以運行。 嘗試多次打開和關閉手電筒,它可以工作。 但是,當我重新啟動應用程序時,它意外關閉。

  • 一個大問題是, 當我第一次啟動該應用程序時,不使用該應用程序就按返回按鈕,然后重新啟動該應用程序,但它仍然意外關閉。 如果我是第一次啟動我的應用程序,請在不使用該應用程序的情況下按回去並啟動我的相機,則會出現“相機不可用”吐司。 (我的代碼僅聲明了兩個變量,並且在onCreate()部分中絕對沒有添加任何代碼,因此我不知道我的應用程序如何/為什么保持相機資源)。

  • 另一個問題是模擬器沒有顯示錯誤 (╯°□°)╯︵┻━┻

PS: android.permission.CAMERA 權限已設置。

碼:

import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.ToggleButton;

public class MainActivity extends Activity {

Camera camera=null;
Parameters p;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 
}

public void flash(View view) {
    // Is the toggle button on?
    boolean on = ((ToggleButton) view).isChecked();

    if (on) {
        // Enable torch
        camera = Camera.open();
        p = camera.getParameters();
        p.setFlashMode(Parameters.FLASH_MODE_TORCH);
        camera.setParameters(p);
        camera.startPreview();
    } else {
        // Disable torch
        p.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(p);
        camera.stopPreview();
        camera.release();
    }
}
}

啟動應用程序,不使用而后退並重新啟動應用程序時,應用程序不會在模擬器上崩潰(與我的手機不同)。 但是仍然發布LogCat。

首次啟動應用程序時:

10-15 16:05:50.229: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:51.529: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:51.529: I/Choreographer(11244): Skipped 49 frames!  The application may be doing too much work on its main thread.
10-15 16:05:51.539: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:51.749: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:51.799: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:51.999: D/dalvikvm(11244): GC_CONCURRENT freed 128K, 9% free 2643K/2888K, paused 30ms+98ms, total 700ms
10-15 16:05:51.999: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.019: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.031: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.139: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.139: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.189: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.219: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.249: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.249: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.320: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:05:52.400: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0

按下時:

10-15 16:08:05.559: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:05.579: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:05.609: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:05.629: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:05.720: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:05.908: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:05.919: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:05.929: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:06.169: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:06.189: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:07.149: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:07.359: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:08.009: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:08.009: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:08.029: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:08.219: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:08.219: I/Choreographer(11244): Skipped 118 frames!  The application may be doing too much work on its main thread.

重啟時:

10-15 16:08:47.629: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:48.909: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:48.909: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.108: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.169: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.379: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.389: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.389: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.450: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.489: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.500: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.500: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.509: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.519: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.619: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0
10-15 16:08:49.730: W/Trace(11244): Unexpected value from nativeGetEnabledTags: 0

附加信息:我檢查了此網站上發布的兩個問題,發現其中一個不相關,另一個過於復雜。 url1 url2

**修改了代碼以使其正常工作,但我仍然不知道以前出現問題的原因。 **

新代碼:

import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.widget.ToggleButton;

public class MainActivity extends Activity {

Camera camera=null;
Parameters p;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main); 
    camera = Camera.open();
    p = camera.getParameters();
}

public void flash(View view) {
    // Is the toggle button on?
    boolean on = ((ToggleButton) view).isChecked();

    if (on) {
        // Enable torch
        p.setFlashMode(Parameters.FLASH_MODE_TORCH);
        camera.setParameters(p);
        camera.startPreview();
    } else {
        // Disable torch

        p.setFlashMode(Parameters.FLASH_MODE_OFF);
        camera.setParameters(p);
        camera.stopPreview();
    }
}

protected void onResume()
{
    super.onResume();
    try
    {
        camera.reconnect();
    }
    catch(Exception e)
    {}
}

protected void onPause()
{
    super.onPause();
    try
    {
        camera.release();
    }
    catch(Exception e)
    {}
}

protected void onStop()
{
    super.onStop();
    try
    {
        camera.release();
    }
    catch(Exception e)
    {}
}
}

我相信您的大多數問題是由於在離開應用程序時無法正確關閉Camera資源。 如果在燈亮的情況下進行操作,則尚未釋放resources

根據文檔 ,使用Camera object的最后一步是這樣的:

重要提示:調用release()釋放相機以供其他應用程序使用。 應用程序應立即在onPause()中釋放相機(並在onResume()中重新打開)。

因此,您可能應該重寫onPause()並添加它,以確保下次運行應用程序或嘗試在其他應用程序中使用相機時, Camera資源可用。

@Override
public void onPause()
{
    camera.release();
    super.onPause();
}

另外,您應該在應用程序崩潰時發布logcat,以便我們可以確切地看到異常所在以及異常發生的位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM