2013-02-27 119 views
3

好吧,我這裏有一個奇怪的一個,如果任何人都可以回答這個問題。ProgressDialog銀河S3沒有顯示時,有沒有SD卡

我有啓動默認的相機拍攝的照片,並上傳到服務器的應用程序。上傳過程發生在擴展AsyncTask的內部類中。在調用異步任務之前,我有一個方法顯示一個進程對話框,然後在AsyncTask的onPost Execute方法中解除對話框。 這一切工作正常在我自己的設備上。我在三星Galaxy S3上測試時出現問題。

我得到一個空指針異常的progressDialog.Show();它不會使應用程序崩潰,它只是不顯示對話框。但是,當我試圖關閉onPostExecute對話框時,確實發生了崩潰。 我認爲這是因爲S3的相機似乎只在橫向打開而引起的(儘管我的整個應用程序被鎖定到縱向,Google可以告訴我的每種方式都是可能的),並且方向更改導致刷新引起參考的活動推進Dialog丟失。

在對話框中實例化的變化再多(onPreExecute()的工作,但我仍然得到同樣的問題),檢查它是否爲空或保存實例狀態已經修復了這個問題。我在另一篇文章中讀到,有些人在保存到SD卡時遇到問題。 S3沒有SD卡,但該應用程序試圖寫入外部存儲。我試着做一個檢查,看看是否有一個SD卡使用。

Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED); 

即使沒有SD卡,它實際上返回true。將圖像寫入外部存儲器並不重要,所以我嘗試使用此方法獲取緩存副本。

File image = File.createTempFile(
      imageFileName, 
      JPEG_FILE_SUFFIX, 
      this.getCacheDir() 
      ); 

這也沒有什麼區別。爲什麼你問我是否關心這個SD卡問題,它不可能影響進度對話框。好吧,如果我將SD卡插入S3,問題消失,進度對話框顯示完美。我不知道爲什麼這個工程可行,但我不能保證使用應用程序的人將在他們的設備中有一個SD卡,所以我需要找到一個適當的修復程序。

對不起,我的文章,但我認爲這需要一點解釋得到一個清醒的認識。任何想法或解決方案將不勝感激。

下面的代碼是我使用了我所要選取相關材料的精簡版。

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

      findViewById(R.id.bCompare).setOnClickListener(new OnClickListener() {    
      public void onClick(View v) { 
     try{ 
      capturedImage = createImageFile(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     if(isNetworkAvailable()){ 
      Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
      i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(capturedImage)); 
      startActivityForResult(i, REQ_CODE_PHOTO_TAKE); 
     } 
     else{ 
      displayAlert("Network Error", "You do not have access to the internet. Please turn on your WiFi."); 
      }   
     }  
    }); 

} 


protected File createImageFile() throws IOException { 
     // Create an image file name 
     String timeStamp = 
       new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); 
     String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_"; 
     File image = File.createTempFile(
       imageFileName, 
       JPEG_FILE_SUFFIX, 
       this.getCacheDir() 
       ); 

     capturedImagePath = image.getAbsolutePath(); 

     return image; 
    } 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == Activity.RESULT_OK) { 
     showProgressDialog(); 
     new LongOperation(getApplicationContext()).execute(""); 

    } else if (resultCode == Activity.RESULT_CANCELED) { 

    }    
} 


private void showProgressDialog(){ 
    progressDialog = new ProgressDialog(this); 
    progressDialog.setMessage("Checking progress"); 
    progressDialog.setCanceledOnTouchOutside(false); 
    progressDialog.show(); 

    } 

//I wont include the full async task because the code executes fine except for the crash on the show progress Dialog so i'll include the onPostExecute 
    @Override 
    protected void onPostExecute(String result) { 
    if (progressDialog != null) { 
     progressDialog.dismiss(); 
    } 

幾乎忘了包含堆棧跟蹤,儘管它不是最有用的信息。這發生在progressDialog上。顯示();

02-27 18:11:33.945: E/WindowManager(21994): Activity com.activity.CompareActivity has leaked window [email protected] that was originally added here 
02-27 18:11:33.945: E/WindowManager(21994): android.view.WindowLeaked: Activity com.activity.CompareActivity has leaked window [email protected] that was originally added here 
02-27 18:11:33.945: E/WindowManager(21994):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:402) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:311) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.view.Window$LocalWindowManager.addView(Window.java:558) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.Dialog.show(Dialog.java:277) 
02-27 18:11:33.945: E/WindowManager(21994):  at com.activity.CompareActivity.showProgressDialog(CompareActivity.java:324) 
02-27 18:11:33.945: E/WindowManager(21994):  at com.activity.CompareActivity.onActivityResult(CompareActivity.java:249) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.Activity.dispatchActivityResult(Activity.java:5368) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.ActivityThread.deliverResults(ActivityThread.java:3178) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2603) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2644) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2130) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3553) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.ActivityThread.access$700(ActivityThread.java:140) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1233) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.os.Handler.dispatchMessage(Handler.java:99) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.os.Looper.loop(Looper.java:137) 
02-27 18:11:33.945: E/WindowManager(21994):  at android.app.ActivityThread.main(ActivityThread.java:4898) 
02-27 18:11:33.945: E/WindowManager(21994):  at java.lang.reflect.Method.invokeNative(Native Method) 
02-27 18:11:33.945: E/WindowManager(21994):  at java.lang.reflect.Method.invoke(Method.java:511) 
02-27 18:11:33.945: E/WindowManager(21994):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
02-27 18:11:33.945: E/WindowManager(21994):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
02-27 18:11:33.945: E/WindowManager(21994):  at dalvik.system.NativeStart.main(Native Method) 
+0

外部存儲是必需的嗎?你可以保存到應用程序自己分配的內部存儲空間嗎? – breadbin 2013-02-27 18:30:43

+0

請參閱http://developer.android.com/guide/topics/data/data-storage.html#filesInternal – breadbin 2013-02-28 11:28:38

+0

使用內部存儲器似乎是解決此問題的方法,但無法從存儲器中訪問應用程序內部存儲器默認相機活動。 [鏈接](http://stackoverflow.com/questions/13402187/android-action-image-capture-with-extra-output-in-internal-memory)。我必須嘗試創建自定義攝像頭活動,但目前它的優先級較低,所以需要等待。 – 2013-03-04 12:03:50

回答

0

什麼不同的圖案,如:

  1. 活動A開始相機活動

  2. CameraActivity將控制返回到活動甲

  3. 活動A立即開始活動B

  4. 活動B沒有佈局/佈局相同

  5. 活動B處理AsyncTask和ProgressDialog。

如果問題以某種方式與該前,後攝像頭活動還活着的活動,這可能會解決這個問題,通過創建一個全新的活動(清白)來處理上傳。你怎麼看?