2017-11-20 5 views
1

Ich habe versucht, den Alarmdialog zu schließen, wenn die Aktivität zerstört wird.android.view.WindowLeaked: Fehler beim Anzeigen des Alarmdialogs mit

@Override 
    public void onDestroy(){ 
     super.onDestroy(); 
     if (alertDialog != null && alertDialog.isShowing()) { 
      alertDialog.dismiss(); 
     } 
    } 

Aber ich habe immer noch einen Fehler:

android.view.WindowLeaked: Activity com.Forewarn.ForewarnApp.activities.SignInActivity has leaked window [email protected][] that was originally added here 
    at android.view.ViewRootImpl.<init>(ViewRootImpl.java:424) 
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:331) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) 
    at android.app.Dialog.show(Dialog.java:316) 
    at com.Forewarn.ForewarnApp.activities.SignInActivity.getFingerPrint(SignInActivity.java:713) 
    at com.Forewarn.ForewarnApp.activities.SignInActivity$8.onClick(SignInActivity.java:428) 
    at android.view.View.performClick(View.java:5612) 
    at android.view.View$PerformClick.run(View.java:22285) 
    at android.os.Handler.handleCallback(Handler.java:751) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:154) 
    at android.app.ActivityThread.main(ActivityThread.java:6123) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 

hier ist meine Tätigkeit:

if(AccountUtils.getIsTouch().equalsIgnoreCase("true")){ 
    checkTouchId.setChecked(true); 
    checkTouchId.setVisibility(View.GONE); 
    txtTouchId.setVisibility(View.VISIBLE); 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     //Fingerprint API only available on from Android 6.0 (M) 
     keyguardManager = (KeyguardManager) getSystemService(KEYGUARD_SERVICE); 
     fingerprintManager = (FingerprintManager) getSystemService(FINGERPRINT_SERVICE); 
     getFingerPrint(); 
    } else { 
     Toast.makeText(getApplicationContext(),"Your Device does not have a Fingerprint Sensor",Toast.LENGTH_SHORT).show(); 
    } 
} else { 
    getFingerPrintHardware(); 
} 

ich Fehler in folgenden Verfahren erhalten: in diesem Ich bin mit zwei Alarm Dialoge.

public void getFingerPrint(){ 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
     if(!fingerprintManager.isHardwareDetected()){ 
      /** 
      * An error message will be displayed if the device does not contain the fingerprint hardware. 
      * However if you plan to implement a default authentication method, 
      * you can redirect the user to a default authentication activity from here. 
      * Example: 
      * Intent intent = new Intent(this, DefaultAuthenticationActivity.class); 
      * startActivity(intent); 
      */ 
      Toast.makeText(getApplicationContext(),"Your Device does not have a Fingerprint Sensor",Toast.LENGTH_SHORT).show(); 

      //textView.setText("Your Device does not have a Fingerprint Sensor"); 
     } else { 
      // Checks whether fingerprint permission is set on manifest 
      if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { 
       //textView.setText("Fingerprint authentication permission not enabled"); 
       Toast.makeText(getApplicationContext(),"Fingerprint authentication permission not enabled",Toast.LENGTH_SHORT).show(); 

      } else{ 
       // Check whether at least one fingerprint is registered 
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
        if (!fingerprintManager.hasEnrolledFingerprints()) { 

         AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(SignInActivity.this,R.style.DialogLevelsStyle); 
         alertDialogBuilder.setTitle("Touch ID isn't Set Up on This Device"); 
         TextView myMsg = new TextView(this); 
         myMsg.setText("To set up Touch ID on this decice, go to Settings > Touch id & Passcode and add a valid fingerprint"); 
         myMsg.setGravity(Gravity.CENTER_HORIZONTAL); 
         myMsg.setPadding(20,50,20,0); 
         myMsg.setTextColor(getResources().getColor(R.color.colorPrimary)); 
         myMsg.setTextSize(15); 
         alertDialogBuilder.setView(myMsg); 
         //alertDialogBuilder.setMessage("Please place your fingertip on the scanner to verify your identity and Login"); 
         alertDialogBuilder.setPositiveButton("Ok",new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           //finish(); 
           //Toast.makeText(getApplicationContext(),"Hai",Toast.LENGTH_SHORT).show(); 
           startActivityForResult(new Intent(Settings.ACTION_SETTINGS), 0); 
          } 
         }); 

         alertDialog = alertDialogBuilder.create(); 
         alertDialog.show(); 

         //textView.setText("Register at least one fingerprint in Settings"); 
         //Toast.makeText(getApplicationContext(),"Register at least one fingerprint in Settings",Toast.LENGTH_SHORT).show(); 

        }else{ 
         // Checks whether lock screen security is enabled or not 
         if (!keyguardManager.isKeyguardSecure()) { 
          //textView.setText("Lock screen security not enabled in Settings"); 
          Toast.makeText(getApplicationContext(),"Lock screen security not enabled in Settings",Toast.LENGTH_SHORT).show(); 

         }else{ 
          AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(SignInActivity.this,R.style.DialogLevelsStyle); 
          alertDialogBuilder.setIcon(R.drawable.fingerprint); 
          alertDialogBuilder.setTitle("Touch Id for FOREWARN"); 
          TextView myMsg = new TextView(this); 
          if(hiddenEmail == null){ 
           myMsg.setText("Sign In with User Id "+userName); 
          }else { 
           myMsg.setText("Sign In with User Id "+hiddenEmail); 
          } 

          myMsg.setGravity(Gravity.CENTER_HORIZONTAL); 
          myMsg.setPadding(10,50,10,0); 
          myMsg.setTextColor(getResources().getColor(R.color.colorPrimary)); 
          myMsg.setTextSize(16); 
          alertDialogBuilder.setView(myMsg); 
          //alertDialogBuilder.setMessage("Please place your fingertip on the scanner to verify your identity and Login"); 
          alertDialogBuilder.setNegativeButton("Cancel",new DialogInterface.OnClickListener() { 
           @Override 
           public void onClick(DialogInterface dialog, int which) { 
            //finish(); 
            Constant.isCanceled = "true"; 
           } 
          }); 

          alertDialog = alertDialogBuilder.create(); 
          alertDialog.show(); 

          generateKey(); 

          if (cipherInit()) { 
           FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher); 
           FingerprintHandler helper = new FingerprintHandler(this); 
           helper.startAuth(fingerprintManager, cryptoObject); 
          } 
         } 
        } 
       } 
      } 
     } 
    } 
} 

Ich habe bereits onDestroy Methode, die dailog.dismiss() ruft. Ich bin verwirrt, um herauszufinden, wo ich falsch gemacht habe. Bitte hilf mir.

+0

zeigen Sie Ihren vollständigen Code. –

+0

können Sie bitte einen Blick auf meinen aktualisierten Code –

+0

Können Sie mir sagen, welcher Code ist bei SignInActivity.java; Zeilennummer: 713? – TheLittleNaruto

Antwort

0

leaked window [email protected][] that was originally added

  • Über Ausnahmen kommen, wenn Dialoge sind nicht dismiss() vor Activity beendet.

Fügen Sie diesen Abschnitt onPause hinzu.

@Override 
    public void onPause(){ 
     super.onPause(); 
     if (alertDialog != null && alertDialog.isShowing()) { 
      alertDialog.dismiss(); 
     } 
    } 

Rectify

if (cipherInit()) { 
          FingerprintManager.CryptoObject cryptoObject = new FingerprintManager.CryptoObject(cipher); 
          FingerprintHandler helper = new FingerprintHandler(this); 
          helper.startAuth(fingerprintManager, cryptoObject); 
         } 
          generateKey(); 
          alertDialog = alertDialogBuilder.create(); 
          alertDialog.show(); 
+0

habe ich schon mit onPause probiert. selbe Fehler im bekommen –

+0

@Laxmanparlapelly versuchen mit 'onResume'. –

+0

wieder gleiche Fehler :( –

0

Im Allgemeinen dieses Problem tritt auf, wenn Sie versuchen, den Dialog zu zeigen, nachdem Ihre Aktivität zerstört wird, fertig, onPause, ...

Einige Lösungen:

  • Überprüfen Sie, ob Sie nicht ca Füllen Sie die alertDialog.show(); im selben übergeordneten Bereich, in dem Sie fertig sind, pausieren oder zerstören Sie Ihre Aktivität und versuchen Sie, sie zu kontrollieren.

    for example, you've started another activity or process and then you try to show your dialog on the current activity

  • können Sie überprüfen, ob die Aktivität vor dem Aufruf des Dialog if(!this.isFinishing()){//show your dialog}this für yourActivity beendet ist

  • Sie können auch einen kleinen Trick den Zustand Ihrer Aktivität zu überprüfen, bevor ein Dialog zu starten. :

    @Override protected void onPause() { isRunning = false; }

    @Override protected void onResume() { isRunning = true; }

Verwandte Themen