您好,登錄后才能下訂單哦!
這篇文章主要介紹Android如何選擇圖片或視頻進行循環(huán)播放,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
項目要求對本地圖片或者視頻進行輪播,功能實現(xiàn)完成后發(fā)現(xiàn)只是在模擬器上運行ok,后來發(fā)現(xiàn)是文件路徑的原因。
文件uri的頭部有兩種一種是以file開頭一種是以content開頭要進行判斷轉(zhuǎn)化
實現(xiàn)如下:
視頻 點擊吊起文件查看:
private void setVideoPath() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("*/*");//設(shè)置類型,我這里是任意類型,任意后綴的可以這樣寫。 intent.addCategory(Intent.CATEGORY_OPENABLE); startActivityForResult(intent, VIDEO_PATH); }
在返回中取得選中文件路徑
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode != RESULT_OK) return; switch (requestCode) { case VIDEO_PATH: Uri uri = data.getData(); String path = getPath( uri); showToastReal("你選中的視頻路徑:" + path); SpUtils.getInstace(this).saveString("videoPath", path); break; case PIC_PATH: Uri picUri = data.getData(); String picPath = getPath(picUri); showToastReal("你選中的圖片路徑:" + picPath); SpUtils.getInstace(this).saveString("picPath", picPath); break; } }
public String getPath(Uri uri) { String path; if ("file".equalsIgnoreCase(uri.getScheme())) {//使用第三方應(yīng)用打開 path = uri.getPath(); return path; } if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) {//4.4以后 path = getPath(this, uri); } else {//4.4以下下系統(tǒng)調(diào)用方法 path = getRealPathFromURI(uri); } return path; } @SuppressLint("NewApi") public String getPath(final Context context, final Uri uri) { final boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; // DocumentProvider if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { // ExternalStorageProvider if (isExternalStorageDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; if ("primary".equalsIgnoreCase(type)) { return Environment.getExternalStorageDirectory() + "/" + split[1]; } } // DownloadsProvider else if (isDownloadsDocument(uri)) { final String id = DocumentsContract.getDocumentId(uri); final Uri contentUri = ContentUris.withAppendedId( Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); return getDataColumn(context, contentUri, null, null); } // MediaProvider else if (isMediaDocument(uri)) { final String docId = DocumentsContract.getDocumentId(uri); final String[] split = docId.split(":"); final String type = split[0]; Uri contentUri = null; if ("image".equals(type)) { contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } else if ("video".equals(type)) { contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if ("audio".equals(type)) { contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } final String selection = "_id=?"; final String[] selectionArgs = new String[]{split[1]}; return getDataColumn(context, contentUri, selection, selectionArgs); } } // MediaStore (and general) else if ("content".equalsIgnoreCase(uri.getScheme())) { return getDataColumn(context, uri, null, null); } // File else if ("file".equalsIgnoreCase(uri.getScheme())) { return uri.getPath(); } return null; } /** * Get the value of the data column for this Uri. This is useful for * MediaStore Uris, and other file-based ContentProviders. * * @param context The context. * @param uri The Uri to query. * @param selection (Optional) Filter used in the query. * @param selectionArgs (Optional) Selection arguments used in the query. * @return The value of the _data column, which is typically a file path. */ public String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) { Cursor cursor = null; final String column = "_data"; final String[] projection = {column}; try { cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); if (cursor != null && cursor.moveToFirst()) { final int column_index = cursor.getColumnIndexOrThrow(column); return cursor.getString(column_index); } } finally { if (cursor != null) cursor.close(); } return null; } /** * @param uri The Uri to check. * @return Whether the Uri authority is ExternalStorageProvider. */ public boolean isExternalStorageDocument(Uri uri) { return "com.android.externalstorage.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is DownloadsProvider. */ public boolean isDownloadsDocument(Uri uri) { return "com.android.providers.downloads.documents".equals(uri.getAuthority()); } /** * @param uri The Uri to check. * @return Whether the Uri authority is MediaProvider. */ public boolean isMediaDocument(Uri uri) { return "com.android.providers.media.documents".equals(uri.getAuthority()); }
實現(xiàn)視頻輪播
public class VideoActivity extends BaseActivity { @Bind(R.id.sv_ad) SurfaceView vv; @Bind(R.id.id_ig_back) ImageView idIgBack; private MediaPlayer mPlayer; private String path; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.activity_video); ButterKnife.bind(this); verifyStoragePermissions(this); init(); // init2(); } private void init2() { String path = SpUtils.getInstace(VideoActivity.this).getString("videoPath"); Uri uri = Uri.parse("file://" + path); try { MediaPlayer mediaPlayer = new MediaPlayer(); mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); mediaPlayer.setDataSource(getApplicationContext(), uri); mediaPlayer.prepare(); mediaPlayer.start(); } catch (IOException e) { e.printStackTrace(); } } private void init() { idIgBack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); vv.getHolder().addCallback(new SurfaceHolder.Callback() { @Override public void surfaceDestroyed(SurfaceHolder holder) { if (mPlayer != null) { mPlayer.stop(); mPlayer.release(); mPlayer = null; } } @Override public void surfaceCreated(SurfaceHolder holder) { path = SpUtils.getInstace(VideoActivity.this).getString("videoPath"); try { if (mPlayer == null) { mPlayer = MediaPlayer.create(VideoActivity.this, Uri.parse("file://" + path)); } if(mPlayer==null){ showToastReal("請在個人中心中選擇正確的視頻"); } mPlayer.setDisplay(holder);//將SurfaceHolder關(guān)聯(lián)mediaplayer mPlayer.setLooping(true); mPlayer.start(); mPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { // TODO Auto-generated method stub return false; } }); } catch (Exception e) { e.printStackTrace(); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } }); } public void onBack(View view) { finish(); } @Override public void loadNetData() { } private static final int REQUEST_EXTERNAL_STORAGE = 1; private static String[] PERMISSIONS_STORAGE = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; /** * 檢查應(yīng)用程序是否允許寫入存儲設(shè)備 * <p> * <p> * <p> * 如果應(yīng)用程序不允許那么會提示用戶授予權(quán)限 * * @param activity */ public static void verifyStoragePermissions(Activity activity) { // Check if we have write permission int permission = ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permission != PackageManager.PERMISSION_GRANTED) { // We don't have permission so prompt the user ActivityCompat.requestPermissions( activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE ); } } }
layout的實現(xiàn)
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <SurfaceView android:id="@+id/sv_ad" android:layout_width="match_parent" android:layout_height="match_parent" /> <ImageView android:id="@+id/id_ig_back" android:layout_width="80dp" android:layout_height="80dp" android:layout_marginTop="16dp" android:padding="16dip" android:src="@drawable/icon_back_white" /> </RelativeLayout>
以上是“Android如何選擇圖片或視頻進行循環(huán)播放”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。