Android 没有SD卡时Galaxy S3上不显示ProgressDialog

Android 没有SD卡时Galaxy S3上不显示ProgressDialog,android,progressdialog,sd-card,android-sdcard,Android,Progressdialog,Sd Card,Android Sdcard,好吧,如果有人能回答的话,我这里有一个奇怪的问题 我有一个应用程序,它可以启动默认相机,拍摄照片并将其上传到服务器。上载过程发生在扩展AsyncTask的内部类中。在调用异步任务之前,我有一个方法显示一个进度对话框,然后在异步任务的onPost Execute方法中取消该对话框。 这一切都可以在我自己的设备上正常工作。当我在三星Galaxy S3上测试它时,问题就出现了 我在progressDialog.Show()上得到一个空指针异常;它不会使应用程序崩溃,只是不会显示对话框。但是,当我试图取

好吧,如果有人能回答的话,我这里有一个奇怪的问题

我有一个应用程序,它可以启动默认相机,拍摄照片并将其上传到服务器。上载过程发生在扩展AsyncTask的内部类中。在调用异步任务之前,我有一个方法显示一个进度对话框,然后在异步任务的onPost Execute方法中取消该对话框。 这一切都可以在我自己的设备上正常工作。当我在三星Galaxy S3上测试它时,问题就出现了

我在progressDialog.Show()上得到一个空指针异常;它不会使应用程序崩溃,只是不会显示对话框。但是,当我试图取消onPostExecute对话框时,确实会遇到崩溃。 我认为这是因为S3的摄像头似乎只在横向打开(尽管我的整个应用程序被锁定在纵向,谷歌可以告诉我一切可能的方式),方向改变导致活动刷新,导致对progressDialog的引用丢失

对话框实例化的位置没有太多的更改(onPreExecute()确实有效,但我仍然遇到相同的问题),检查它是否为null或保存实例状态已修复此问题。我在另一篇文章中看到,有些人在保存到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卡问题?它不可能影响进度对话框。如果我在S3中放入SD卡,问题就会消失,进度对话框就会完美地显示出来。我不知道为什么会这样,但我不能保证使用该应用的人在他们的设备中会有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.show()上

02-27 18:11:33.945:E/WindowManager(21994):Activity com.Activity.CompareActivity已泄漏window com.android.internal.policy.impl.PhoneWindow$DecorView@41ed6318原来是加在这里的
02-27 18:11:33.945:E/WindowManager(21994):android.view.WindowLeaked:Activity com.Activity.CompareActivity已泄漏window com.android.internal.policy.impl.PhoneWindow$DecorView@41ed6318原来是加在这里的
02-27 18:11:33.945:E/WindowManager(21994):在android.view.ViewRootImpl。(ViewRootImpl.java:402)
02-27 18:11:33.945:E/WindowManager(21994):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:311)
02-27 18:11:33.945:E/WindowManager(21994):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
02-27 18:11:33.945:E/WindowManager(21994):在android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
02-27 18:11:33.945:E/WindowManager(21994):在android.view.Window$LocalWindowManager.addView(Window.java:558)
02-27 18:11:33.945:E/WindowManager(21994):在android.app.Dialog.show(Dialog.java:277)
02-27 18:11:33.945:E/WindowManager(21994):位于com.activity.CompareActivity.showProgressDialog(CompareActivity.java:324)
02-27 18:11:33.945:E/WindowManager(21994):位于com.activity.CompareActivity.onActivityResult(CompareActivity.java:249)
02-27 18:11:33.945:E/WindowManager(21994):位于android.app.Activity.dispatchActivityResult(Activity.java:5368)
02-27 18:11:33.945:E/WindowManager(21994):在android.app.ActivityThread.deliverResults(ActivityThread.java:3178)
02-27 18:11:33.945:E/WindowManager(21994):在android.app.ActivityThread.performResumeActivity(ActivityThread.java:2603)
02-27 18:11:33.945:E/WindowManager(21994):位于android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2644)
02-27 18:11:33.945:E/WindowManager(21994):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2130)
02-27 18:11:33.945:E/WindowManager(21994):在android.app.ActivityThread.handleRunchActivity(ActivityThread.java:3553)
02-27 18:11:33.945:E/WindowManager(21994):在android.app.ActivityThread.access$700(ActivityThread.java:140)
02-27 18:11:33.945:E/WindowManager(21994):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1233)
02-27 18:11:33.945:E/WindowManager(21994):位于android.os.Handler.dispatchMessage(Handler.java:99)
02-27 18:11:33.945:E/WindowManager(21994):位于android.os.Looper.loop(Looper.java:137)
02-27 18:11:33.945:E/WindowManager(21994):位于android.app.ActivityThread.main(ActivityThread.java:4898)
02-27 18:11:33.945:E/WindowManager(21994):位于java.lang.reflect.Method.Invokenactive(本机方法)
02-27 18:11:33.945:E/WindowManager(21994):位于java.lang.reflect.Method.invoke(Method.java:511)
02-27 18:11:33.945:E/WindowManager(21994):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
02-27 18:11:33.945:E/WindowManager(21994):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
02-27 18:11:33.945:E/WindowManager(21994):在dalvik.system.NativeStart.main(本机方法)

另一种模式如何,例如:

  • 活动A启动相机活动

  • CameraActivity将控件返回给活动A

  • 活动A立即启动活动B

  • 活动B没有布局/布局相同

  • 活动B处理AsyncTask和ProgressDialog

  • 如果没有
    02-27 18:11:33.945: E/WindowManager(21994): Activity com.activity.CompareActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41ed6318 that was originally added here
    02-27 18:11:33.945: E/WindowManager(21994): android.view.WindowLeaked: Activity com.activity.CompareActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41ed6318 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)