2014-01-27 28 views
0

我正在創建一個動態表單活動,我得到如何從一個數據庫的形式指示。該活動實質上只是滾動問題列表並查看它們是什麼類型並添加它們。所以這是一個增加視圖作爲問題的活動。這一切都很好。我試圖將回答/問題保留在僅限於基本問題子類的特定問題類中。如何通過一個單獨的參數通過相機意圖android

我遇到的問題是,當我嘗試添加相機「問題」以提示用戶拍照時,我無法在視圖中看到結果。我在視圖中管理啓動活動,並將結果返回到問卷活動。這個活動並不知道它要添加到哪個問題,因爲它都是動態完成的。所以我嘗試通過作爲攝影機意圖中額外的問題來通過questionId並在調查問卷活動中接收它,然後滾動查看所添加的問題,並且如果它是相同的問題,則將圖片添加到與其關聯的問題。

它增加問題的方式是通過在每個部件中插入一個視圖組。

這是啓動相機的相關部分(我嘗試過沒有使用捆綁包)。 這是一個BaseQuestion的子類,只是一個一個的LinearLayout的子類裏面:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      Bundle bundle = new Bundle(); 
      bundle.putInt("questionId", getQuestionId()); 
      intent.putExtras(bundle); 
      intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
        Environment.getExternalStorageDirectory(), "image.tmp"))); 
      ((Activity)getContext()).startActivityForResult(intent, TAKE_PHOTO); 

這是處理其結果是在一個活動的相關部分。

protected void onActivityResult(int requestCode, int resultCode, 
     Intent imageReturnedIntent) { 
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent); 
    Bitmap image = null; 
    switch (requestCode) 
    { 
     case TAKE_PHOTO: 
     { 
      if (resultCode == RESULT_OK) 
      { 
       InputStream inputStream = null; 
       File file = new File(Environment.getExternalStorageDirectory(), 
         "image.tmp"); 
       try { 
        inputStream = new FileInputStream(file); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } 
       if (inputStream == null) { 
        Uri uri = imageReturnedIntent.getData(); 
        try { 
         inputStream = getContentResolver().openInputStream(uri); 
        } catch (FileNotFoundException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
       image = createScaledBitmapFromStream(inputStream, 200, 300); 
       Bundle bundle = imageReturnedIntent.getExtras(); 
       if (bundle != null) 
       { 
        int questionId = bundle.getInt("questionId"); 
        for (BaseQuestion questionView : questionViews) 
        { 
         if (questionId == questionView.getQuestionId()) 
         { 
          questionView.setResponse(image); 
         } 
        } 
       } 
      } 
      else if (resultCode == Activity.RESULT_CANCELED) 
      { 
       Log.d("something", "something"); 
      } 
      break; 
     } 
    } 
} 

編輯:解決了,可能無法從答案

我在超我設置爲-1作出明確questionIdForResult。然後,我在運行startActivityForResult時將它設置爲questionId,然後在onActivityResult中檢查每個問題,如果它們的questionIdForResult與它們的questionId匹配,那麼使用那個。然後我把它設置回-1以確定你是否有兩個,它不會去到另一個。

回答

4

您的方法將無法正常工作,因爲沒有任何相機應用程序需要將傳入的Intent中的額外內容奇蹟般地複製到結果Intent。事實上,如果任何相機活動都這樣做,我會感到很驚訝。

您可以將questionId()存儲在活動的數據成員中(例如,questionIdForTheNextActivityResult),然後在onActivityResult()中使用該值。但請記住,使用第三方應用拍攝照片意味着您的流程可能會在您再次獲得控制權之前終止,因此請務必通過onSaveInstanceState()保存該數據成員並通過onRestoreInstanceState()將其恢復。

+0

但是我怎麼能通過它呢?這聽起來像是你建議將變量作爲全局值存儲在活動中。我仍然有問題在沒有事先知道id的情況下將它傳遞迴活動。當從相機回來時,我怎麼把它傳回去? – Gentatsu

+0

@Gentatsu:「我還有一個問題,就是在沒有事先知道id的情況下將它傳回給活動」 - 如果你有足夠的「id知識」將它放入額外的'Intent'中, startActivity()',你有足夠的「ID知識」來簡單地把它保存在數據成員的活動中。 – CommonsWare

+0

它創建時知道每個問題的所有id,但不知道里面發生了什麼。該活動僅充當一個容器。這是去CameraQuestionView - > CameraActivity - > QuestionnaireActivity。如果它返回到CameraQuestionView,我會很好。這個活動持有所有的ID,它不能區分哪一個添加信息,我只需要告訴它需要去哪一個。 對不起,如果我聽起來粗魯無禮,但它是相當令人沮喪的試圖得到我想說的話連貫的足夠。 – Gentatsu