2016-06-21 14 views
0
import android.preference.PreferenceFragment; 
import android.support.v13.app.FragmentCompat; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 

public class Preferences extends PreferenceFragment implements OnPreferenceClickListener, FragmentCompat.OnRequestPermissionsResultCallback { 
if (ContextCompat.checkSelfPermission(activity, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
    != PackageManager.PERMISSION_GRANTED) { 
ActivityCompat.requestPermissions(activity, 
     new String[]{ android.Manifest.permission.WRITE_EXTERNAL_STORAGE }, 
     Constant.WRITE_STORAGE_PERMISSION); 

} 

public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grants) { } 

Ich versuche, die neuen Berechtigungen zu erhalten. Der Dialog zeigt an, dass die Berechtigung angefordert wird, wenn dies der Fall ist, aber onRequestPermissionResult wird nie aufgerufen, sei es Ablehnung oder Annahme.OnRequestPermissionsResultCallback triggert nicht in PreferenceFragment

Irgendeine Idee? Die Beispiele verwenden alle Aktivität und kein Fragment, das könnte also das Problem sein. Ich bin mir auch nicht sicher, welches Compat ich verwenden soll (v4 vs. v13). Min SDK ist 14.

Antwort

1

vollständiger Code für Sie:

public interface PermissionResultListener { 
     public void onPermissionResult(int requestCode, 
             String permissions[], int[] grantResults); 
    } 



    public class Preferences extends PreferenceFragment implements Preference.OnPreferenceClickListener, 
     PermissionResultListener { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    public void requestPermission() { 

     Activity activity = getActivity(); 
     if (activity != null && activity instanceof MainActivity) { 
      MainActivity mainActivity = (MainActivity) activity; 
      mainActivity.requestPermissionStorage(); 
      mainActivity.setPermissionResultListener(this); 
     } 

    } 

    @Override 
    public boolean onPreferenceClick(Preference preference) { 
     return false; 
    } 

    @Override 
    public void onPermissionResult(int requestCode, String[] permissions, int[] grantResults) { 
     // request permission result here 
    } 
} 

public class MainActivity extends AppCompatActivity { 

    private PermissionResultListener mPermissionResultListener; 

    public void setPermissionResultListener(PermissionResultListener mPermissionResultListener) { 
     this.mPermissionResultListener = mPermissionResultListener; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     // Check that the activity is using the layout version with 
     // the fragment_container FrameLayout 
     if (findViewById(R.id.fragment_container) != null) { 

      // However, if we're being restored from a previous state, 
      // then we don't need to do anything and should return or else 
      // we could end up with overlapping fragments. 
      if (savedInstanceState != null) { 
       return; 
      } 

      // Create a new Fragment to be placed in the activity layout 
      Preferences preferences = new Preferences(); 

      // In case this activity was started with special instructions from an 
      // Intent, pass the Intent's extras to the fragment as arguments 
      preferences.setArguments(getIntent().getExtras()); 

      // Add the fragment to the 'fragment_container' FrameLayout 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.fragment_container, preferences).commit(); 
     } 

    } 

    public void requestPermissionStorage() { 

     if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) 
       != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(this, 
        new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, 
        Constant.WRITE_STORAGE_PERMISSION); 
     } 

    } 

    @Override 
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
     super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

     if (mPermissionResultListener != null) { 
      mPermissionResultListener.onPermissionResult(requestCode, permissions, grantResults); 
     } 


    } 
} 
+0

gleiches Ergebnis. Wie ist das anders? Das Problem ist 'public void onRequestPermissionsResult (int requestCode, @NonNull String [] Berechtigungen, @NonNull int [] grantResults) {}' wird nie aufgerufen. – xBlue

+0

Was sind 'activity.setPermissionResultListener()' und 'permissionResultListener.onPermissionResult'? – xBlue

+0

@xBlue, public void onRequestPermissionsResult (int requestCode, String [] Berechtigungen, int [] grantResults) {}, diese Methode wurde nur in Aktivität aufgerufen, nicht in Fragment, daher müssen Sie diese Methode in Aktivität implementieren, um eine Verbindung zwischen Aktivität und Fragment, müssen Sie die Schnittstelle PermissionResultListener erstellen. in Ihrer Aktivität bedeuten, müssen Sie Variable permissionResultListener deklarieren und Methode public void setPermissionResultListener (PermissionResultListener permissionResultListener) –

Verwandte Themen