【问题标题】:Access videos both in internal storage and external SD card - Android访问内部存储和外部 SD 卡中的视频 - Android
【发布时间】:2015-08-30 00:21:02
【问题描述】:

我开发了一个简单的 android 应用程序,它将从 path="storage/MicroSD/Videos" 并将它们显示在列表视图中,选择视频后,将播放所选视频。播放位于 Storage/MicroSD/Videos 中的视频。但其他路径中的视频不会被获取。请给出一些想法,如何从所有路径(内部存储和外部存储)获取视频。此外,如果我在不同的手机上运行相同的应用程序,SD 卡路径会有所不同,例如 Storage/SD Card o/videos。 现在是我的问题:如何以编程方式获得指向任何设备默认视频目录的File-object?

主要活动

    public class MainActivity extends Activity {

    private ListView mListView;
    private List<String> fileNameList;
    public  String path="storage/MicroSD/Videos";
    private File file;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    file = Environment.getExternalStorageDirectory();
    fileNameList = getFileListfromSDCard();
    final ListView listView = (ListView) findViewById(R.id.list);
    ArrayAdapter<String> adapter1 = new ArrayAdapter<String> (this,android.R.layout.simple_list_item_1, android.R.id.text1, fileNameList);
    listView.setAdapter(adapter1);
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            int itemPosition = position;
            String itemValue = (String)   listView.getItemAtPosition(position);
            Intent intent = new Intent(MainActivity.this, com.video.videolibrary.SelectedVideo.class);
            intent.putExtra("id", id);
            intent.putExtra("itemValue", itemValue);
            intent.putExtra("path", path);
            startActivity(intent);
        }

        });

    Button button = (Button) findViewById(R.id.btn_Online);
    // Capture button clicks
    button.setOnClickListener(new OnClickListener() {
        public void onClick(View arg0) {
           Intent myIntent = new Intent(MainActivity.this,com.video.videolibrary.SelectedVideo.class);
            startActivity(myIntent);
        }
    });

    }

    private List<String> getFileListfromSDCard() {

    File files = new File(path);
    FileFilter filter = new FileFilter() {
        private final List<String> exts = Arrays.asList("mp4","MP4");
        @Override
        public boolean accept(File pathname) {
            String ext;
            String path = pathname.getPath();
            ext = path.substring(path.lastIndexOf(".") + 1);
            return exts.contains(ext);
        }
    };

    final File [] filesFound = files.listFiles(filter);
    List<String> flLst = new ArrayList<String>();
    if (filesFound != null && filesFound.length > 0) {
        for (File file : filesFound) {
            flLst.add(file.getName());
         }
    }
    return flLst;
    }

    }

选定的视频类

        public class SelectedVideo extends Activity {
        VideoView view;AudioManager audioManager;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.selected_video);
        view = (VideoView)findViewById(R.id.videoView1);
       Bundle bundle = getIntent().getExtras();
       String path=bundle.getString("path");
       String itemValue = bundle.getString("itemValue");
      view.setVideoURI(Uri.parse(path+"/"+itemValue ));
      VideoView videoView = (VideoView) findViewById(R.id.videoView1);
      MediaController mediaController = new MediaController(this);
      mediaController.setAnchorView(videoView);
      Uri uri = Uri.parse(path+"/"+itemValue);
      DisplayMetrics dm = new DisplayMetrics();
      this.getWindowManager().getDefaultDisplay().getMetrics(dm);
      int height = dm.heightPixels;
      int width = dm.widthPixels;
     videoView.setMinimumWidth(width);
     videoView.setMinimumHeight(height);
     videoView.setMediaController(mediaController);
     videoView.setVideoURI(uri);
     videoView.requestFocus();
     audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
     int maxVolume =    audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
     int curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
     SeekBar volControl = (SeekBar)findViewById(R.id.volbar);
     volControl.setMax(maxVolume);
     volControl.setProgress(curVolume);
     volControl.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {

        @Override
        public void onStopTrackingTouch(SeekBar arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onStartTrackingTouch(SeekBar arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2)    {
            // TODO Auto-generated method stub
            audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, arg1, 0);
        }
        });

        Button stopbutton = (Button) findViewById(R.id.btn_stop);
        stopbutton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            view.pause();

            }
        });

        Button playbutton = (Button) findViewById(R.id.btn_play);
        playbutton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            Bundle bundle = getIntent().getExtras();
            String itemValue = bundle.getString("itemValue");
            Toast.makeText(getApplicationContext(),
                    itemValue, Toast.LENGTH_LONG)
                    .show();
            view.start();
        }
        });

        Button backbutton = (Button) findViewById(R.id.btn_back);
        backbutton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
            view.stopPlayback();
            startActivity(new Intent(SelectedVideo.this, MainActivity.class));
            }
        });

        }
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }
    }

Android 清单文件

        <uses-permission android:name="android.permission.INTERNET"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <uses-permission android:name="android.permission.read_external_storage" />
        <application
        android:allowBackup="true"
        android:icon="@mipmap/video_library"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:configChanges="orientation|keyboardHidden">
        <activity
        android:name="com.video.videolibrary.MainActivity"
        android:label="@string/app_name">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        </activity>
        <activity
        android:name=".SelectedVideo">
        </activity>
        </application>

        </manifest>

【问题讨论】:

    标签: android storage android-videoview


    【解决方案1】:

    首先:不要硬编码你的 SD 卡的路径。您应该使用getExternalStorageDirectory () 来获取指向此位置的File-object。所以你的变量files 应该分配如下:

    File files= Environment.getExternalStorageDirectory(Environment.DIRECTORY_MOVIES);
    

    因为这将为您返回默认位置,用户可以访问的视频将被存储在该位置,这个位置应该可以满足您的需求。

    android api 是这样说的:

    注意:不要被这里的“外部”一词所迷惑。这个目录 最好将其视为媒体/共享存储。它是一个文件系统 可以容纳相对大量的数据,并且可以共享 所有应用程序(不强制执行权限)。传统上这是 SD 卡,但它也可以作为内置存储实现 不同于受保护的内部存储的设备,并且可以 作为文件系统安装在计算机上。

    另一种选择是使用ContentProvider。使用 Cursor,您可以查询这个并获取每个索引视频。这将使您无需显式搜索视频。

    一个基本的Cursor-query 基本上看起来像这样:

    Cursor cursor=getContentResolver().query(
        MediaStore.Video.Media,              // The content URI of the table
        mProjection,                         // The columns to return for each row
        mSelectionClause,                    // Selection criteria
        null,                                // replacing placeholders of Selection criterias
        mSortOrder);                         // The sort order for the returned rows
    
        while(cursor.moveToNext()){
         //work with your data here
        }
    

    从你的 Android-Manifest.xml 中删除这一行,这是不必要的:

    <uses-permission android:name="android.permission.read_external_storage" />
    

    【讨论】:

    • 文件文件 = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES);命令返回默认存储在移动内存中的视频(m_ASUS_Display_Demo.mp4),其他视频(SD卡中的存储和什么是应用视频)没有列出。
    【解决方案2】:

    试试这个:

        String path = Environment.getExternalStorageDirectory().toString();
       // String path = "Environment.getExternalStorageDirectory().toString()+"/myvideo";
    
        ArrayList<String>alPath=new ArrayList<String>();
        ArrayList<String> alName=new ArrayList<String>();
    
        File directory = new File(path);
        File[] file = directory.listFiles();
        for (int i = 0; i < file.length; i++) {
    
                alName.add(file[i].getName());
               alPath.add(file[i].getAbsolutePath());
    
    
        ArrayAdapter<String> arrayAdapter=new ArrayAdapter<String>
       (VideoList.this,android.R.layout.simple_list_item_1,alName);
        listView.setAdapter(arrayAdapter);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 2013-03-03
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      相关资源
      最近更新 更多