курсор нулевой в первый раз, и recyclerView не показывает данные курсора - PullRequest
0 голосов
/ 21 июня 2019

В моем приложении я вызываю курсор, а затем отправляю курсор адаптеру recyclerView, но проблема заключается в следующем: при первом запросе прав пользователя курсор возвращает нулевое значение, и поэтому recyclerView не заполняет данные.

Я прочитал эти решения, но они не решили мою проблему. 1. Разрешение Android READ_EXTERNAL_STORAGE не работает 2. Разрешение READ_EXTERNAL_STORAGE для Android 3. Разрешение READ_CONTACTS для Android 6.0 (Marshmallow) позволяет читать имя Контакта при отказе в разрешении 4. разрешение. READ_CONTACTS не работает

Мое приложение отображает данные при перезапуске приложения, поскольку оно не запрашивает разрешения пользователя.


public class MainActivity extends AppCompatActivity {
    RecyclerView recyclerView;
    Cursor mCursor=null;
    recyclerViewSongAdapter mAdapter;

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

        requestStoragePermission();
        mCursor = getSongCursor();

        if(mCursor==null)
            Log.v("cursor_nullification","NO");

        View playButton = findViewById(R.id.myPlayButtonId);
        playButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "PLAY music", Toast.LENGTH_SHORT).show();
                //Intent intent = new Intent(getBaseContext(),SongPlaying.class);
                //intent.putExtra("song_")
            }
        });

        recyclerView = findViewById(R.id.SongListId);

        mAdapter = new recyclerViewSongAdapter(this,mCursor);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.VERTICAL,false);
        //RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getApplicationContext(),2);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        //Toast.makeText(this, "Toast calling", Toast.LENGTH_SHORT).show();
        recyclerView.setAdapter(mAdapter);
    }

    public Cursor getSongCursor(){
        try{
            Log.v("cursor_method_start","till now okay");
            Uri externalUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;
            String[] projection = new String[]{
                    MediaStore.Audio.Media._ID,
                    MediaStore.Audio.Media.DISPLAY_NAME,
                    MediaStore.Audio.Media.ALBUM,
                    MediaStore.Audio.Media.ARTIST,
                    MediaStore.Audio.Media.DATA,
                    MediaStore.Audio.Media.SIZE,
                    MediaStore.Audio.Media.TITLE,
                    MediaStore.Audio.Media.TRACK,
                    MediaStore.Audio.Media.YEAR
            };
            String selection = null;
            String[] selectionArgs = null;
            String sortOrder = MediaStore.Audio.Media.TITLE+" ASC";
            Log.v("calling_cursor_formation","Okay till now");
            Cursor songCursor = getContentResolver().query(externalUri,projection,selection,selectionArgs,sortOrder);
            Toast.makeText(this, "Cursor formation", Toast.LENGTH_SHORT).show();
            return songCursor;
        }catch (Exception e) {
            Toast.makeText(this, "ERROR!!!", Toast.LENGTH_SHORT).show();
            return null;
        }
    }

    private static final int MY_PERMISSIONS_REQUEST = 100;
    private void requestStoragePermission() {
        if (ContextCompat.checkSelfPermission(MainActivity.this,
                Manifest.permission.READ_EXTERNAL_STORAGE)
                != PackageManager.PERMISSION_GRANTED) {
            ActivityCompat.requestPermissions(MainActivity.this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
                    MY_PERMISSIONS_REQUEST);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode,
                                           String permissions[], int[] grantResults) {
        switch (requestCode) {
            case MY_PERMISSIONS_REQUEST: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0
                        && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                    // permission was granted, yay! Do the
                    // file-related task you need to do.

                }
                else {

                    // permission denied, boo! Disable the
                    // functionality that depends on this permission.
                }
                return;
            }
        }
    }


}

Я довольно новичок в курсоре, поэтому я не знаю, где их использовать. Должен ли я вызывать курсор в фоновом режиме или эта строка кода верна для вызова курсора и как я могу получить свои данные курсора только после получения разрешений пользователя. Спасибо

Ответы [ 2 ]

0 голосов
/ 21 июня 2019

Изначально с onCreate() вам следует позвонить getSongCursor() после проверки версии ОС и, если разрешение предоставлено на вышеуказанных устройствах M:

if (android.os.Build.VERSION.SDK_INT < M || (android.os.Build.VERSION.SDK_INT >= M && context.checkSelfPermission(GlobalConstants.WRITE_EXTERNAL_PERMISSION) == PackageManager.PERMISSION_GRANTED)){
   mCursor = getSongCursor();
   setAdapterInRecyclerView(); // created below
}else {
   requestStoragePermission();
}

И позвонить mCursor = getSongCursor(); после получения разрешения от пользователя:

@Override
public void onRequestPermissionsResult(int requestCode,
                                       String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST: {
            // If request is cancelled, the result arrays are empty.
            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                  mCursor = getSongCursor();  // here
                  setAdapterInRecyclerView(); // created below 

            }
            else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
            }
            return;
        }
    }
}

Пожалуйста, не стесняйтесь спрашивать больше

ОБНОВЛЕНИЕ: создайте метод для настройки Адаптера и вызова после getSongCursor():

private void setAdapterInRecyclerView(){
 mAdapter = new recyclerViewSongAdapter(this,mCursor);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext(),LinearLayoutManager.VERTICAL,false);
        //RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(getApplicationContext(),2);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        //Toast.makeText(this, "Toast calling", Toast.LENGTH_SHORT).show();
        recyclerView.setAdapter(mAdapter);
}
0 голосов
/ 21 июня 2019

добавьте приведенный ниже код в вашу учетную запись и удалите null инициализацию формы Cursor mCursor=null;

private void onStart()
{
    super.onStart();
    requestStoragePermission();
}
...