2015-05-01 4 views
-2

Я не уверен, правильно ли я это понимаю, но в соответствии с жизненным циклом действия onCreate выполняется первым. Таким образом, я попытался продолжить выполнение этой операции, вызвав метод onStart.Белый экран при запуске активности

Не уверен, что это даже правильная вещь. Независимо от того, как я начинаю деятельность (через кнопку в основном), все, что я вижу, это белый экран. У меня есть setContentView, но не кажется, что onCreate даже запущен.

У меня также есть деятельность, включенная в манифест правильно, и я уверен в этом.

По-прежнему новичок в этом и действительно не уверен, что делать, и хотел бы получить совет по правильному методу управления методами деятельности. Это сообщество фантастическое и помогло мне много в прошлом, так что спасибо.

package example.myapplication; 

import android.app.Activity; 
import android.content.Context; 
import android.hardware.Camera; 
import android.net.Uri; 
import android.os.Bundle; 
import android.os.Environment; 
import android.util.Log; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.widget.Button; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

/** A basic Camera preview class */ 
public class CameraPreview extends Activity implements SurfaceHolder.Callback{ 

private android.hardware.Camera.PictureCallback mPicture; 
private Camera mCamera; 
private CameraPreview mPreview; 
private SurfaceHolder mHolder; 
private SurfaceHolder holder; 

public void setContentView(int activity_camera) {} 
public static final int MEDIA_TYPE_IMAGE = 1; 
public static final int MEDIA_TYPE_VIDEO = 2; 
private static final String TAG = "CameraPreview"; 

SurfaceView camera_preview; 
Button button_capture; 

public CameraPreview(){ 
    super(); 
} 

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_camera); 

    button_capture = (Button) findViewById(R.id.button_capture); 
    camera_preview = (SurfaceView) findViewById(R.id.camera_preview); 
    onStart(); 
} 

public void onStart(Context context, Camera camera) { 
    mCamera = camera; 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    // deprecated setting, but required on Android versions prior to 3.0 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

public void surfaceCreated(SurfaceHolder holder) { 
    // The Surface has been created, now tell the camera where to draw the preview. 
    try { 
     mCamera.setDisplayOrientation(90); 
     mCamera.setPreviewDisplay(holder); 
     mCamera.startPreview(); 
    } catch (IOException e) { 
     Log.d(TAG, "Error setting camera preview: " + e.getMessage()); 
    } 
} 

public void surfaceDestroyed(SurfaceHolder holder) { 
    super.onDestroy(); 
    // empty. Take care of releasing the Camera preview in your activity. 
} 

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    // If your preview can change or rotate, take care of those events here. 
    // Make sure to stop the preview before resizing or reformatting it. 

    if (mHolder.getSurface() == null){ 
     // preview surface does not exist 
     return; 
    } 

    // stop preview before making changes 
    try { 
     mCamera.stopPreview(); 
    } catch (Exception e){ 
     // ignore: tried to stop a non-existent preview 
    } 

    // set preview size and make any resize, rotate or 
    // reformatting changes here 

    // start preview with new settings 
    try { 
     mCamera.setPreviewDisplay(mHolder); 
     mCamera.startPreview(); 

    } catch (Exception e){ 
     Log.d(TAG, "Error starting camera preview: " + e.getMessage()); 
    } 
} 

public void onPictureTaken(byte[] data, Camera camera) { 
    File pictureFile = getOutputMediaFile(MEDIA_TYPE_IMAGE); 
    if (pictureFile == null){ 
     Log.d(TAG, "Error creating media file, check storage permissions: "); 
     return; 
    } 
    try { 
     FileOutputStream fos = new FileOutputStream(pictureFile); 
     fos.write(data); 
     fos.close(); 

    } catch (FileNotFoundException e) { 
     Log.d(TAG, "File not found: " + e.getMessage()); 

    } catch (IOException e) { 
     Log.d(TAG, "Error accessing file: " + e.getMessage()); 
    } 
} 

/** Create a file Uri for saving an image or video */ 
private static Uri getOutputMediaFileUri(int type){ 
    return Uri.fromFile(getOutputMediaFile(type)); 
} 

/** Create a File for saving an image or video */ 
private static File getOutputMediaFile(int type){ 
    // To be safe, you should check that the SDCard is mounted 
    // using Environment.getExternalStorageState() before doing this. 

    File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES), "MyCameraApp"); 
    // This location works best if you want the created images to be shared 
    // between applications and persist after your app has been uninstalled. 

    // Create the storage directory if it does not exist 
    if (! mediaStorageDir.exists()){ 
     if (! mediaStorageDir.mkdirs()){ 
      Log.d("MyCameraApp", "failed to create directory"); 
      return null; 
     } 
    } 

    // Create a media file name 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HH:mm:ss").format(new Date()); 
    File mediaFile; 
    if (type == MEDIA_TYPE_IMAGE){ 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
       "IMG_"+ timeStamp + ".jpg"); 
    } else if(type == MEDIA_TYPE_VIDEO) { 
     mediaFile = new File(mediaStorageDir.getPath() + File.separator + 
       "VID_"+ timeStamp + ".mp4"); 
    } else { 
     return null; 
    } 

    return mediaFile; 
} 

public void onClick() { 
    // Add a listener to the Capture button 
    Button captureButton = (Button) findViewById(R.id.button_capture); 
    captureButton.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View arg0){ 
      // get an image from the camera 
      mCamera.takePicture(null, null, mPicture); 
     } 
    }); 
} 

public SurfaceHolder getHolder() { 
    return holder; 
} 

public void setHolder(SurfaceHolder holder) { 
    this.holder = holder; 
} 
} 
+0

Попробуйте удалить весь код и просто поместите ** onCreate() **. Вы узнаете эту проблему. – Wizard

+0

Если вы использовали аннотацию @Override над вашим методом onStart(), как вы это делали с onCreate(), система предупредила бы вас, что вы не отступаете от суперкласса. – PPartisan

ответ

0

Вам не нужно называть метод onStart(). Вам просто нужно рассмотреть метод onCreate(). Вот где вы начинаете свою работу.

Также вы вызываете неправильный метод setContentView(). Вы должны назвать это так:

setContentView(R.layout.activity_camera); 

ВНУТРИ ваш метод onCreate().

+0

О, прошу прощения, я даже этого не заметил. Я уже получил его внутри onCreate(), но похоже, что это также публично объявлено, что глупо. Оказывается, это была проблема, и теперь все работает! Большое спасибо! – masteryupa

3

Нет! Методы жизненного цикла (например, onCreate(), onStart(), onResume() и т. Д.) Вызываются системой android напрямую, никогда не называйте их сами. Рассмотрим жизненный цикл активности here, чтобы узнать, как система вызывает каждый метод.

Кроме того, глядя на ваш код, ваш собственный метод onStart() не называется нигде. Глядя на сигнатуре методы:

public void onStart(Context context, Camera camera) { 

Вы только неосторожно перегружены по умолчанию метода onStart() предоставленного андроидом. Что на самом деле не вызывает проблем, пока вы не вызовете неправильный метод в onCreate(), как показано здесь:

@Override 
public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_camera); 

    button_capture = (Button) findViewById(R.id.button_capture); 
    camera_preview = (SurfaceView) findViewById(R.id.camera_preview); 
    onStart(); // <-- That is the activity's onStart, not yours! 
} 

означает, что весь блок:

public void onStart(Context context, Camera camera) { 
    mCamera = camera; 

    // Install a SurfaceHolder.Callback so we get notified when the 
    // underlying surface is created and destroyed. 
    mHolder = getHolder(); 
    mHolder.addCallback(this); 
    // deprecated setting, but required on Android versions prior to 3.0 
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
} 

никогда не вызывался.

Либо вы сбрасываете весь этот код в onCreate(), либо называете метод чем-то другим, чтобы вы не путали себя.

+0

Благодарим вас за ответ. Это имеет большой смысл, я вроде знал, что это будет ответ. Как только я переименовал метод, чтобы сказать startCameraPreview, что было бы подходящим способом его запуска? У меня возникли проблемы с пониманием того, где (контекст контекста, камера камеры) вписывается в него. – masteryupa

+0

@masteryupa Ознакомьтесь с [настоящим руководством] (https://developer.android.com/guide/topics/media/camera.html) о том, как использовать камеру. Я бы сказал, что вы хотите запустить камеру где-нибудь в 'onResume()' и уничтожить ее где-нибудь в 'onPause()'. – initramfs

+0

Да, это руководство, из которого я получил весь код. Я чувствую, что теперь проблема заключается в том, что у меня есть SurfaceView, но не помещайте что-либо с камеры на него. – masteryupa

Смежные вопросы