【问题标题】:music player - read storage permissions issue音乐播放器 - 读取存储权限问题
【发布时间】:2018-09-18 18:30:35
【问题描述】:

我的手机中读取存储的权限有问题。我必须列出手机中的所有音频文件,所以我尝试使用“activitycompact.requestPermissions”请求权限唯一的问题是,当应用程序安装并首次打开时,它会显示“MusicPlayer 已停止”,然后在该对话框打开后请求权限,所以我允许它,然后我不得不重新打开这个文件。我不知道如何在崩溃之前请求这些权限。

主要活动

public class MainActivity extends ListActivity {

private static final int UPDATE_FREQUENCY = 500;
private static final int STEP_VALUE = 4000;
private MediaCursorAdapter mediaAdapter = null;
private TextView selectedFile= null;
private SeekBar seekbar = null;
private MediaPlayer player = null;
private ImageButton playButton = null;
private ImageButton previousButton = null;
private  ImageButton nextButton = null;
private boolean isStarted = true;
private  String currentFile = "";
private boolean isMovingseekBar = false;
private final Handler handler = new Handler();
private final Runnable updatePositionRunnable = new Runnable() {
    public  void run() {
        updatePosition();

    }
};

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

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

    selectedFile = (TextView) findViewById(R.id.selectedfile);
    seekbar = (SeekBar) findViewById(R.id.seekbar);
    playButton = (ImageButton) findViewById(R.id.play);
    previousButton = (ImageButton) findViewById(R.id.previous);
    nextButton = (ImageButton) findViewById(R.id.next);

    player = new MediaPlayer();

    player.setOnCompletionListener(onCompletion);
    player.setOnErrorListener(onError);
    seekbar.setOnSeekBarChangeListener(seekBarChanged);
    Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

    if (null != cursor) {
        cursor.moveToFirst();

        mediaAdapter = new MediaCursorAdapter(this, R.layout.listitem, cursor);
        setListAdapter(mediaAdapter);
        playButton.setOnClickListener(onButtonClick);
        nextButton.setOnClickListener(onButtonClick);
        previousButton.setOnClickListener(onButtonClick);
    }
}
@Override
protected  void onListItemClick(ListView list, View view, int position,long id) {
    super.onListItemClick(list, view, position, id);
    currentFile = (String) view.getTag();
    startPlay(currentFile);
}
@Override
protected void onDestroy(){
    super.onDestroy();

    handler.removeCallbacks(updatePositionRunnable);
    player.stop();
    player.reset();
    player.release();

    player = null;
}
private  void startPlay(String file) {
    selectedFile.setText(file);
    seekbar.setProgress(0);

    player.stop();
    player.reset();

    try {
        player.setDataSource(file);
        player.prepare();
        player.start();
    } catch (IllegalArgumentException e){
        e.printStackTrace();
    } catch (IllegalStateException e){
        e.printStackTrace();
    } catch (IOException e){
        e.printStackTrace();
    }

    seekbar.setMax(player.getDuration());
    playButton.setImageResource(android.R.drawable.ic_media_pause);

    updatePosition();

    isStarted = true;

}

private void stopPlay() {
    player.stop();
    player.reset();
    playButton.setImageResource(android.R.drawable.ic_media_play);
    handler.removeCallbacks(updatePositionRunnable);
    seekbar.setProgress(0);

    isStarted = false;
}
private void updatePosition() {
    handler.removeCallbacks(updatePositionRunnable);

    handler.postDelayed(updatePositionRunnable, UPDATE_FREQUENCY);
}


private class MediaCursorAdapter extends SimpleCursorAdapter{

    MediaCursorAdapter(Context context, int layout, Cursor c){
        super(context, layout,c,
                new String[] {MediaStore.MediaColumns.DISPLAY_NAME, MediaStore.MediaColumns.TITLE, MediaStore.Audio.AudioColumns.DURATION},
                new int[] {R.id.displayname, R.id.title,R.id.duration});
    }

    @Override
    public void bindView(View view,Context context, Cursor cursor) {
        TextView title = (TextView) view.findViewById(R.id.title);
        TextView name = (TextView) view.findViewById(R.id.displayname);
        TextView duration = (TextView) view.findViewById(R.id.duration);

        name.setText(cursor.getString(
                cursor.getColumnIndex(MediaStore.MediaColumns.DISPLAY_NAME)));

        title.setText(cursor.getString(
                cursor.getColumnIndex(MediaStore.MediaColumns.TITLE)));

        view.setTag(cursor.getString(cursor.getColumnIndex(MediaStore.MediaColumns.DATA)));
    }
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.listitem, parent, false);

        bindView(v, context, cursor);

        return v;
    }
}



private View.OnClickListener onButtonClick  = new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.play: {
                if (player.isPlaying()) {
                    handler.removeCallbacks(updatePositionRunnable);
                    player.pause();
                    playButton.setImageResource(android.R.drawable.ic_media_play);
                } else {
                    if (isStarted) {
                        player.start();
                        playButton.setImageResource(android.R.drawable.ic_media_pause);
                        updatePosition();
                    } else {
                        startPlay(currentFile);
                    }
                }
                break;
            }
            case R.id.next: {
                int seekto = player.getCurrentPosition() + STEP_VALUE;

                if (seekto < player.getDuration())
                    seekto = player.getDuration();
                player.pause();
                player.seekTo(seekto);
                player.start();

                break;
            }
            case R.id.previous: {
                int seekto = player.getCurrentPosition() - STEP_VALUE;

                if (seekto < player.getDuration())
                    seekto = player.getDuration();

                player.pause();
                player.seekTo(seekto);
                player.start();

                break;

            }
        }
    }
};
private MediaPlayer.OnCompletionListener onCompletion = new MediaPlayer.OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {
        stopPlay();
    }
};

private MediaPlayer.OnErrorListener onError = new MediaPlayer.OnErrorListener() {

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {

        return false;
    }
};


private SeekBar.OnSeekBarChangeListener seekBarChanged = new SeekBar.OnSeekBarChangeListener() {
    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        isMovingseekBar = false;
    }

    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fomUser) {
        if (isMovingseekBar) {
            player.seekTo(progress);
            Log.i("OnSeekBarChangeListener", "onProgressChange");
        }
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        isMovingseekBar = true;
    }
};

【问题讨论】:

  • 在此处发布 logcat 错误。
  • 您是否在清单中添加了所需的权限?
  • 我认为您在清单中缺少权限,或者如果您尝试在 6.0 或更高版本上运行应用程序,那么您需要在运行时请求权限。

标签: java android audio-player android-music-player


【解决方案1】:

1) 请确保您已在 Manifest.XML 中添加权限

2) 我看不到您正在处理请求的权限结果。

从您的 onCreate 中删除以下内容

Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);

    if (null != cursor) {
        cursor.moveToFirst();

        mediaAdapter = new MediaCursorAdapter(this, R.layout.listitem, cursor);
        setListAdapter(mediaAdapter);
}

并保持在一边

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

    if(requestCode ==YOUR_REQ_CODE) {

     if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    //Do your  stuff here.
 } 
    }

【讨论】:

  • onRequestPermissionsResult 中做事不一定是最好的主意。如果已经授予权限,则首先没有理由请求任何内容,因此不会调用该方法。
【解决方案2】:

问题似乎是您没有等待获得许可。

首先,我会在此块中包含需要您的危险权限的代码

if (ContextCompat.checkSelfPermission(thisActivity, 
      Manifest.permission.[Permissionname])
    == PackageManager.PERMISSION_GRANTED) {
// Do Something here ...
}
else
{
   //Ask for permission
}

并等待权限活动结果,然后这样继续。

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

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

        } else {

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

    // other 'case' lines to check for other
    // permissions this app might request.
}
}

请注意,只有在未获得许可时,您才需要请求许可。

【讨论】:

    【解决方案3】:

    试试这个,
    在 onCreate() 中添加这个

    if( checkIfAlreadyhavePermission(activity, Manifest.permission.READ_EXTERNAL_STORAGE) ){
    
    // Add the code here the code you need to work after accepting permission
    
    player = new MediaPlayer();
    
    player.setOnCompletionListener(onCompletion);
    player.setOnErrorListener(onError);
    seekbar.setOnSeekBarChangeListener(seekBarChanged);
    Cursor cursor = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
    
    if (null != cursor) {
        cursor.moveToFirst();
    
        mediaAdapter = new MediaCursorAdapter(this, R.layout.listitem, cursor);
        setListAdapter(mediaAdapter);
      }
        }else {
            requestForSpecificPermission(
                    activity, Manifest.permission.READ_EXTERNAL_STORAGE);
        }
    

    并将其添加到 MainActivity

    public  boolean checkIfAlreadyhavePermission(Activity activity, String permission) {
        int result = ContextCompat.checkSelfPermission(activity, permission);
        if (result == PackageManager.PERMISSION_GRANTED) {
            return true;
        } else {
            return false;
        }
    }
    public  void requestForSpecificPermission(Activity activity, String granted_permission) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ActivityCompat.requestPermissions(activity,  new String[]{granted_permission}, 101);
    
        }
    }
    

    请注意,如果您只有权限问题,它将起作用。请分享您的日志猫

    【讨论】:

      【解决方案4】:

      当询问权限时使用下面的代码..

       if (ActivityCompat.checkSelfPermission(EdittextActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                      if (ActivityCompat.shouldShowRequestPermissionRationale(EdittextActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE)) {
                          WriteBtn(view); // hear define your code after getting permission.
                      }
                      else {
                          ActivityCompat.requestPermissions(EdittextActivity.this,new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
                      }
                  }
      

      还有当您允许权限并调用您在代码下方使用的特定方法时..

      @Override
      public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
          super.onRequestPermissionsResult(requestCode, permissions, grantResults);
          if (requestCode==1){
              display(); // call your method that required permission.
          }
      }
      

      【讨论】:

        【解决方案5】:

        希望对您有所帮助:

        --------------------------------
         <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 
        
         Add this line in manifest
        
         if any error then 
            <permission
            android:name="android.permission.READ_EXTERNAL_STORAGE"
            android:protectionLevel="signature" />
          - Optional 
        
        
        ------------------------------
        
        public class PermissionUtils 
        {
        
        Context context;
        Activity current_activity;
        
        PermissionResultCallback permissionResultCallback;
        
        
        ArrayList<String> permission_list=new ArrayList<>();
        ArrayList<String> listPermissionsNeeded=new ArrayList<>();
        String dialog_content="";
        int req_code;
        
        public PermissionUtils(Context context)
        {
            this.context=context;
            this.current_activity= (Activity) context;
        
            permissionResultCallback= (PermissionResultCallback) context;
        }
        
        
        /**
         * Check the API Level & Permission
         *
         * @param permissions
         * @param dialog_content
         * @param request_code
         */
        
        public void check_permission(ArrayList<String> permissions, String dialog_content, int request_code)
        {
            this.permission_list=permissions;
            this.dialog_content=dialog_content;
            this.req_code=request_code;
        
           if(Build.VERSION.SDK_INT >= 23)
           {
               if (checkAndRequestPermissions(permissions, request_code))
               {
                   permissionResultCallback.PermissionGranted(request_code);
                   Log.i("all permissions", "granted");
                   Log.i("proceed", "to callback");
               }
           }
            else
           {
               permissionResultCallback.PermissionGranted(request_code);
        
               Log.i("all permissions", "granted");
               Log.i("proceed", "to callback");
           }
        
        }
        
        
        /**
         * Check and request the Permissions
         *
         * @param permissions
         * @param request_code
         * @return
         */
        
        private  boolean checkAndRequestPermissions(ArrayList<String> permissions, int request_code) {
        
            if(permissions.size()>0)
            {
                listPermissionsNeeded = new ArrayList<>();
        
                for(int i=0;i<permissions.size();i++)
                {
                    int hasPermission = ContextCompat.checkSelfPermission(current_activity,permissions.get(i));
        
                    if (hasPermission != PackageManager.PERMISSION_GRANTED) {
                        listPermissionsNeeded.add(permissions.get(i));
                    }
        
                }
        
                if (!listPermissionsNeeded.isEmpty())
                {
                    ActivityCompat.requestPermissions(current_activity, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),request_code);
                    return false;
                }
            }
        
            return true;
        }
        
        /**
         *
         *
         * @param requestCode
         * @param permissions
         * @param grantResults
         */
        public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
        {
            switch (requestCode)
            {
                case 1:
                     if(grantResults.length>0)
                     {
                         Map<String, Integer> perms = new HashMap<>();
        
                         for (int i = 0; i < permissions.length; i++)
                         {
                             perms.put(permissions[i], grantResults[i]);
                         }
        
                         final ArrayList<String> pending_permissions=new ArrayList<>();
        
                         for (int i = 0; i < listPermissionsNeeded.size(); i++)
                         {
                             if (perms.get(listPermissionsNeeded.get(i)) != PackageManager.PERMISSION_GRANTED)
                             {
                                if(ActivityCompat.shouldShowRequestPermissionRationale(current_activity,listPermissionsNeeded.get(i)))
                                        pending_permissions.add(listPermissionsNeeded.get(i));
                                else
                                {
                                    Log.i("Go to settings","and enable permissions");
                                    permissionResultCallback.NeverAskAgain(req_code);
                                   // Toast.makeText(current_activity, "Go to settings and enable permissions", Toast.LENGTH_LONG).show();
                                    return;
                                }
                             }
        
                         }
        
                         if(pending_permissions.size()>0)
                         {
                             showMessageOKCancel(dialog_content,
                                     new DialogInterface.OnClickListener() {
                                         @Override
                                         public void onClick(DialogInterface dialog, int which) {
        
                                             switch (which) {
                                                 case DialogInterface.BUTTON_POSITIVE:
                                                     check_permission(permission_list,dialog_content,req_code);
                                                     break;
                                                 case DialogInterface.BUTTON_NEGATIVE:
                                                     Log.i("permisson","not fully given");
                                                     if(permission_list.size()==pending_permissions.size())
                                                         permissionResultCallback.PermissionDenied(req_code);
                                                     else
                                                         permissionResultCallback.PartialPermissionGranted(req_code,pending_permissions);
                                                     break;
                                             }
        
        
                                         }
                                     });
        
                         }
                         else
                         {
                            Log.i("all","permissions granted");
                            Log.i("proceed","to next step");
                             permissionResultCallback.PermissionGranted(req_code);
        
                         }
        
        
        
                     }
                     break;
            }
        }
        
        
        /**
         * Explain why the app needs permissions
         *
         * @param message
         * @param okListener
         */
        private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
            new AlertDialog.Builder(current_activity)
                    .setMessage(message)
                    .setPositiveButton("Ok", okListener)
                    .setNegativeButton("Cancel", okListener)
                    .create()
                    .show();
           }
        
         }
        
         =============================
        
        
            // You can add any permission here
        
            ArrayList<String> permissions = new ArrayList<>();
            PermissionUtils permissionUtils;
        
        
            permissionUtils = new PermissionUtils(context);
        
            permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        
            //i.e permissions.add(Manifest.permission.READ_EXTERNAL_STORAGE);
        
            permissionUtils.check_permission(permissions,getResources()
           .getString(R.string.explain_here_why_the_app_needs_permissions), 1);
        
        
         =============================
        
         Activty that implements PermissionResultCallback
        
         ===================
        
         Make interface
        
         public interface PermissionResultCallback
         {
          void PermissionGranted(int request_code);
          void PartialPermissionGranted(int request_code, ArrayList<String> 
                                                        granted_permissions);
          void PermissionDenied(int request_code);
          void NeverAskAgain(int request_code);
         }
        
        -----------------------------
        

        【讨论】:

        • 无法理解我的代码有什么问题,请您简要介绍一下
        • 代码没有任何问题(除了它没有完全遵循 Java 命名约定)。您的答案只是代码,没有任何理由。
        • 好的兄弟,下次我会处理的,谢谢您的宝贵回复
        猜你喜欢
        • 2016-08-01
        • 2021-04-09
        • 1970-01-01
        • 1970-01-01
        • 2014-04-13
        • 2016-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多