2016-05-13 8 views
0

In der folgenden Code, getInfoFromDevice wird nicht ausgeführt, ich versuchte auch mit einem Log.d(), aber es könnte nicht weiter helfen.Android: Funktion läuft nicht mit Laufzeitberechtigungen in Android

Im Code verwende ich Laufzeitberechtigungen, um zu überprüfen, ob der Benutzer die Berechtigung zum Zugriff auf externen Speicher gewährt hat, und wenn ja, wird die Funktion getInfoFromDevice() aufgerufen. Ich bin mir nicht sicher, ob die Platzierung der Funktion korrekt ist oder nicht? Aber diese Funktion wird nicht ausgeführt. Was könnte der Grund sein?

Es sind keine Störungen wirft,

public class MainActivity extends Activity implements ActivityCompat.OnRequestPermissionsResultCallback { 

    ArrayList<String> listOfSongs = new ArrayList<String>(); 
    ListView liststructure; 
    final private int REQUEST_CODE_ASK_PERMISSIONS = 123; 
    String MUSIC_STRING = MediaStore.Audio.Media.IS_MUSIC + "!=0"; 
    String[] STAR = {"*"}; 
    String orderColumns = MediaStore.Audio.AudioColumns.TITLE + " COLLATE LOCALISED ASC"; 
    private final int REQUEST_GRANTED_BY_USER = 1; 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     checkPermissions(); 
     liststructure = (ListView) findViewById(R.id.listView); 


     SongsList list = new SongsList(MainActivity.this, listOfSongs); 
     liststructure.setAdapter(list); 

    } 

    private void checkPermissions() { 
     int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, 
       Manifest.permission.READ_EXTERNAL_STORAGE); 


     if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 



      ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_GRANTED_BY_USER); 


     } 

    } 

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


     if(requestCode == REQUEST_GRANTED_BY_USER) 
     { 

     getInfoFromDevice(); 


     } else { 
        // Permission Denied 
        Toast.makeText(MainActivity.this, "EXTERNAL_STORAGE Denied", Toast.LENGTH_SHORT) 
          .show(); 
       } 





    } 

    void getInfoFromDevice() { 
     Uri uri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; 
     Cursor cursor = getContentResolver().query(uri, STAR, MUSIC_STRING, null, null); 

     if (cursor != null) 

     { 
      if (cursor.moveToFirst()) { 
       do { 
        String name = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)); 
        String data = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.DATA)); 
        String album = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM)); 
        String albumID = cursor.getString(cursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID)); 
        listOfSongs.add(album + " " + name + " " + albumID); 

       } while (cursor.moveToNext()); 

      } 
     } 

    } 


} 

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

EDIT 1

Der Code für MP3-Dateien mit Hilfe von MediaStore Bibliothek aussehen wird und prüft, ob es eine Berechtigung hat, externen Speicher zuzugreifen, und wenn ja, es wird die Funktion getInfoFromDevice()

Antwort

2

nennen nur Code ändern Sie wie folgt:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     liststructure = (ListView) findViewById(R.id.listView); 
     SongsList list = new SongsList(MainActivity.this, listOfSongs); 
     liststructure.setAdapter(list); 

     checkPermissions(); 
    } 

    private void checkPermissions() { 
     if (Build.VERSION.SDK_INT >= 23) { 
     int permissionCheck = ContextCompat.checkSelfPermission(MainActivity.this, 
       Manifest.permission.READ_EXTERNAL_STORAGE); 
      if (permissionCheck != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(MainActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_GRANTED_BY_USER); 
      }else{ 
       getInfoFromDevice(); 
      } 
     }else{ 
      getInfoFromDevice(); 
     } 
    } 
+0

Ehrfürchtig arbeitete diese wie ein Zauber. –

+0

Warum überprüfen wir am Ende die Berechtigungen? –

+0

vor Show-Erlaubnisdialog. Ermöglichen, dass die Aktivität beendet wird (Laden von Ansichten auf dem Bildschirm). Deshalb nur. –

0

Prüfen Sie zuerst die Erlaubnis, wie unten,

public void checkPermission(String permission) { 
    if (ContextCompat.checkSelfPermission(BaseActivity.this, 
      permission) 
      != PackageManager.PERMISSION_GRANTED) { 

     if (ActivityCompat.shouldShowRequestPermissionRationale(BaseActivity.this, 
       Manifest.permission.READ_EXTERNAL_STORAGE)) { 

      ActivityCompat.requestPermissions(BaseActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
        10); 

     } else { 
      ActivityCompat.requestPermissions(BaseActivity.this, 
        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 
        10); 

     } 
    } 
} 

dann,

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode) { 
     case 10: { 
      if (grantResults.length > 0 
        && grantResults[0] == PackageManager.PERMISSION_GRANTED)      
      { 
       // permission granted call your function 
       getInfoFromDevice(); 

      } else { 
       // permission denied. 
      } 
      return; 
     } 
    } 
} 

Sie können auch unten Plugin verwenden, um leicht Laufzeit Erlaubnis ohne mehr Aufwand hinzufügen, https://android-arsenal.com/details/1/3571