2017-06-12 4 views
2

Wenn mein Fragment aufgebläht ist, öffnet es eine dialog box für die Berechtigung WRITE_EXTERNAL_STORAGE, wie in Android 6.0 erforderlich. Ich habe jedes Tutorial verfolgt, aber keine meiner Aktionen wird ausgeführt, wenn die Berechtigung erteilt oder verweigert wird. Ich möchte, dass die App geschlossen wird und ein Toast angezeigt wird, wenn die Berechtigung verweigert wird. Dies bedeutet permission would be asked again, wenn die App erneut geöffnet wird.Aktion funktioniert nicht bei Berechtigung verweigert

Fragment Start:

public class SecondFragment extends Fragment { 

View myView; 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { 
    myView = inflater.inflate(R.layout.second_layout, container, false); 
    configureImageButton(); 
    ((MainActivity) getActivity()).setActionBarTitle("App"); 

    if (ContextCompat.checkSelfPermission(getActivity(), 
      Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 
     if (ActivityCompat.shouldShowRequestPermissionRationale(getActivity(), 
       Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 
     } else { 
      ActivityCompat.requestPermissions(getActivity(), 
        new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        1); 
     } 
    } 

onRequestPermissionsResult:

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case 1: 
      if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
       Snackbar.make(myView, "Permission Granted.", Snackbar.LENGTH_LONG).show(); 
      } else if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_DENIED) { 
       Toast.makeText(getActivity(), "Reopen app and allow permission.", Toast.LENGTH_LONG).show(); 
       getActivity().finish(); 
      } 
    } 
} 

Die App gewährt/verweigert die Erlaubnis aber ignoriert den Toast oder Snackbar. Alle Vorschläge sind willkommen. Vielen Dank!

+0

Das Problem ist mit den 'ActivityCompat.requestPermissions'. In Ihrem Fall wird 'onRequestPermissionsResult' in der Aktivität und nicht im Fragment aufgerufen. Wenn Sie die Funktion 'requestPermissions' des Fragments verwenden, ruft sie das' onRequestPermissionsResult' des Fragments auf. – aborocz

+0

@aborocz Ihre Erklärung hat sehr viel Sinn gemacht, ich habe den Code stattdessen in meine Aktivität verschoben, weil das nicht innerhalb des Fragments funktionieren würde. Jetzt funktioniert es perfekt. Vielen Dank. –

Antwort

0

innerhalb Fragment einige Änderungen gibt es plz versuchen Sie es wie unten

private void checkLocationPermission() { 
    if (ContextCompat.checkSelfPermission(this.mContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) 
      != PackageManager.PERMISSION_GRANTED) { 

     // Should we show an explanation? 
     if (shouldShowRequestPermissionRationale(Manifest.permission.WRITE_EXTERNAL_STORAGE)) { 


      //Prompt the user once explanation has been shown 
      requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        MY_PERMISSIONS_REQUEST_CODE); 


     } else { 
      // No explanation needed, we can request the permission. 
      requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        MY_PERMISSIONS_REQUEST_CODE); 
     } 
    } 
} 

wo MY_PERMISSIONS_REQUEST_CODE = 1 in Ihrem Fall

+0

Ich habe versucht, den Code oben einzufügen, aber es erfordert API-Level 23+ und in meiner App verwende ich (und möchte weiterhin verwenden) API-Level 19+, gibt es einen Workaround dafür? Danke –

+0

wenn api 19 dann keine Notwendigkeit, eine Erlaubnis zu prüfen becase app permition Start von 23 api –

+0

Hahah natürlich denke ich gerade nicht. Vielen Dank! –

0

(1) Wenn Ihre App bereits gewährt wurde, können Sie nicht die Erlaubnis Dialog durch diese sehen Code.

Also, gehen Sie zu Einstellung - Anwendung - Ihre App - und deaktivieren Sie Ihre Berechtigungen bereits erteilt, und führen Sie Ihre App erneut.

(2) Gibt Ihre onCreateView myView korrekt zurück? In Ihrem Beispielcode gibt es keine "return myView;"

0
public static final int RequestPermissionCodeStorage = 105; // Declare Global Variable  

    public boolean checkStoragePermission() { 

       if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 

        int result = ContextCompat.checkSelfPermission(this, 
          Manifest.permission.WRITE_EXTERNAL_STORAGE); 
        if (result == PackageManager.PERMISSION_GRANTED) { 
         return true; 
        } else { 
         ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, RequestPermissionCodeStorage); 
         return false; 
        } 
       } else { 
        return true; 
       } 
      } 


    @Override 
     public void onRequestPermissionsResult(int requestCode, 
               String permissions[], int[] grantResults) { 
      switch (requestCode) { 

       case RequestPermissionCodeStorage: { 

        if (grantResults.length > 0 
          && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 

        } else { 
         Toast.makeText(this, "Allow Permission of Storage", Toast.LENGTH_LONG).show(); 
         finish(); 
        } 
        return; 
       } 
      } 
     } 
Verwandte Themen