2016-04-10 3 views
0

Теперь я изучаю программирование с помощью Android, и я создаю приложение, чтобы сделать снимок с помощью камеры с помощью этого урока.onActivityResult вызывается только после нажатия на подкладку

http://developer.android.com/training/camera/photobasics.html

Но onActivity не называется автоматически, оно вызывается только когда я нажимаю кнопку назад, после съемки с моим устройством.

package com.olchowski.valentin.cam2dial; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.pm.ActivityInfo; 
import android.graphics.Bitmap; 
import android.net.Uri; 
import android.os.Environment; 
import android.provider.MediaStore; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Window; 
import android.view.WindowManager; 
import android.widget.Toast; 

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

public class MainActivity extends Activity { 

    static final int REQUEST_IMAGE_CAPTURE = 1; 
    String mCurrentPhotoPath; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
    setContentView(R.layout.activity_main); 
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 


    if (intent.resolveActivity(getPackageManager()) != null) { 
     File photoFile = null; 
     try { 
      photoFile = createImageFile(); 
     } catch (IOException ex) { 
      Toast.makeText(this, "Exception", Toast.LENGTH_SHORT).show(); 
     } 

     if (photoFile != null) { 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile)); 
      startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); 
     } else { 
      Toast.makeText(this, "Exception", Toast.LENGTH_SHORT).show(); 
     } 
    } 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Toast.makeText(this, "RENDERING", Toast.LENGTH_SHORT).show(); 
    if(requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { 
     Toast.makeText(this, "PHOTO TAKEN", Toast.LENGTH_SHORT).show(); 
     finish(); 
    } 
} 

private File createImageFile() throws IOException { 
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
    String imageFileName = "JPEG_" + timeStamp + "_"; 
    File storageDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES); 
    File image = File.createTempFile(imageFileName,".jpg", storageDir); 
    mCurrentPhotoPath = "file:" + image.getAbsolutePath(); 
    return image; 
} 
} 
+0

Вы имеете в виду, что вы нажимаете кнопку BACK в приложении камеры, а затем вызывается 'onActivityResult()' в вашей деятельности? – CommonsWare

+0

Да, когда я запускаю приложение, я могу взять много фотографий, как я хочу. И после того, как я нажму кнопку назад, вызывается onActivityResult(). Но я хотел, чтобы меня вызывали после того, как было сделано одно изображение, пользователь нажал кнопку ok или save. – jupper

ответ

1

Поведение ACTION_IMAGE_CAPTURE относится к приложению камеры. Существуют тысячи моделей устройств, которые поставляются с сотнями различных приложений для камер. Кроме того, есть приложения для камер, загружаемые из Play Маркета и в другое место.

У некоторых есть ошибки.

В этом случае ACTION_IMAGE_CAPTUREдолжен вернуться к вашему приложению, как только пользователь сделает снимок. По какой-то причине разработчики этого приложения для камеры решили не делать этого или не проверили ACTION_IMAGE_CAPTURE.

Вы ничего не можете по этому поводу сделать, кроме как использовать ACTION_IMAGE_CAPTURE (например, использовать API-интерфейс камеры напрямую).

+0

Это был правильный намек ;-). Я попробовал, с другим устройством, и это сработало, как я и хотел. Благодаря! – jupper

0

Я думаю, ваша проблема в том, что фотографии, которые вы берете с камерой не может сохранить должным образом на диске из-за использования createTempFile() метода. также вы должны указать некоторую информацию о том, какую версию андроида вы используете для тестирования и некоторые другие подробности. Вы используете временные метки для обозначения ваших фотографий, сделанных камерой, и по умолчанию гарантируете уникальность имен ваших файлов. поэтому использование метода createTempFile() является избыточным. Я пробую ваш код с помощью метода создания new File() и его работа выполнена правильно.

0

onActivityResult() вызывается, когда действие, которое вы вызываете, закрывается таким образом, что это ожидаемое поведение.

Нажатие клавиши «Назад» закрывает операцию, позволяющую доставлять результат.

Вы не можете получить результат из действия, которое все еще открыто.

+0

Итак, как я могу закрыть Activity, после того как фотография будет сделана автоматически? – jupper

+0

Вы, вероятно, не можете, но я предполагаю, что это зависит от того, какое приложение камеры вы используете. – Kuffs

0

Если это ограничение из вашей досягаемости, лучшим вариантом является создание вашей пользовательской активности для захвата с помощью камеры. Here - пример того, как это можно сделать. Я его не тестировал. Но вы должны понять это, поскольку это не кажется сложным.

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