2016-04-10 48 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()。但是我想在用戶點擊確定或保存按鈕之後拍攝一張照片後被調用。 – jupper

回答

1

ACTION_IMAGE_CAPTURE的行爲取決於相機應用程序。有數以千計的設備模型,運送數百個不同的相機應用程序。此外,還有可從Play商店和其他地方下載的相機應用程序。

一些有bug。

在這種情況下,ACTION_IMAGE_CAPTURE應該一旦用戶拍攝照片就會返回到您的應用程序。無論出於何種原因,這款相機應用的實施者都選擇不這樣做,或者沒有好好測試ACTION_IMAGE_CAPTURE

除了不使用ACTION_IMAGE_CAPTURE(例如,直接使用相機API)之外,您無法對此做任何事情。

+0

這是正確的提示;-)。我試過了,用另一個設備,它按照我的意願工作。謝謝! – jupper

0

我覺得你的問題是,你用相機的照片不能正常節省,因爲使用createTempFile()方法的磁盤。 你也應該提供一些關於你使用什麼版本的android測試和一些更多細節的信息。 您正在使用時間戳命名相機拍攝的照片,並且默認情況下保證您的文件名是唯一的。所以使用createTempFile()的方法是多餘的。我用​​創建方法嘗試你的代碼,並且它的工作正常。

0

onActivityResult()在您要調用的活動關閉時調用,以便實現這種預期行爲。

按下「返回」鍵可關閉允許傳送結果的活動。

您無法從仍處於打開狀態的活動中獲取結果。

+0

好的,如何在拍攝照片後自動關閉活動? – jupper

+0

你可能不能,但我會認爲這取決於你正在使用哪個相機應用程序。 – Kuffs

0

如果這是一個超出您的範圍的限制,那麼最好的選擇是創建您的自定義活動,通過攝像頭捕捉。 Here是一個如何完成的例子。我沒有測試過它。但是,你應該能夠弄明白,因爲它看起來並不複雜。

相關問題