一.最近在做一个需求,手机文件的快速扫描功能。
先附上效果图:
二.这边写了四种类型的文件识别,分别为音视频,图片,文件,并调取手机文件,这边分别用了四个Fragment,方便复制粘贴,用哪个粘哪个,不要太感动呢. 下面附上代码:
package com.example.wenjianshibie;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import com.example.wenjianshibie.Adapter.MyFragmentPagerAdapter;
import com.example.wenjianshibie.Fragment.DocumentFileFragment;
import com.example.wenjianshibie.Fragment.MediaFragment;
import com.example.wenjianshibie.Fragment.OtherFragment;
import com.example.wenjianshibie.Fragment.PictureFragment;
import com.google.android.material.tabs.TabLayout;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
TabLayout tabLayout;
ViewPager viewPager;
List<String> titles;
List<Fragment> fragments;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabLayout = (TabLayout) findViewById(R.id.mytab);
viewPager = (ViewPager) findViewById(R.id.vp_myfile);
titles = new ArrayList<>();
titles.add("影音");
titles.add("图片");
titles.add("文档");
titles.add("其他");
//创建构造方法
initView();
}
private void initView() {
fragments = new ArrayList<>();
//影音
fragments.add(new MediaFragment());
//图片
fragments.add(new PictureFragment());
//文档
fragments.add(new DocumentFileFragment());
//其他
fragments.add(new OtherFragment());
//适配器
MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(), fragments, titles);
viewPager.setAdapter(myFragmentPagerAdapter);
// 使用ViewPager进行设置
tabLayout.setupWithViewPager(viewPager);
}
}
这边附上Fragment 的适配器。
package com.example.wenjianshibie.Adapter;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import java.util.List;
//1.Framgnt 适配器
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
private FragmentManager fragmentManager;
private List<Fragment> fragmentList;
private List<String> title;
public MyFragmentPagerAdapter(FragmentManager supportFragmentManager, List<Fragment> fragments,List<String> titles) {
super(supportFragmentManager);
fragmentManager = supportFragmentManager;
fragmentList = fragments;
title = titles;
}
@Override
public Fragment getItem(int position) {
return fragmentList.get(position);
}
@Override
public int getCount() {
return fragmentList.size();
}
@Override
public CharSequence getPageTitle(int position){
return title.get(position);
}
}
这边用到了是TabLayout+ViewPager之间的切换 有需要的可以粘贴哈.附上布局文件
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.google.android.material.tabs.TabLayout
android:id="@+id/mytab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:tabTextColor="#ffffff"
app:tabBackground="@drawable/tab_background"
app:tabMode="fixed"
/>
<androidx.viewpager.widget.ViewPager
android:id="@+id/vp_myfile"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/mytab"/>
</RelativeLayout>
1.第一个Fragment 音视频功能.
package com.example.wenjianshibie.Fragment;
import android.app.ProgressDialog;
import android.os.Build;
import android.provider.MediaStore;
import android.view.View;
import android.widget.ExpandableListView;
import androidx.annotation.RequiresApi;
import com.example.wenjianshibie.Adapter.ExpandablieAdapter;
import com.example.wenjianshibie.Base.FileInfo;
import com.example.wenjianshibie.Gongjulei.FileInfoManager;
import com.example.wenjianshibie.Adapter.ObserverAdapter;
import io.reactivex.Observable;
import io.reactivex.ObservableEmitter;
import io.reactivex.ObservableOnSubscribe;
import com.example.wenjianshibie.R;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
/**
* 1.影音Fragment
*/
public class MediaFragment extends BaseFileFragment {
private ExpandableListView expandableListview;
private FileInfoManager bfm;
private ArrayList<String> groupList = new ArrayList<>();
private ArrayList<List<FileInfo>> bxFilesList = new ArrayList<List<FileInfo>>();
private ExpandablieAdapter expandablieAdapter;
private Map<String, List<FileInfo>> avChooseMap = new HashMap<>();
private List<FileInfo> audioFiles = new ArrayList<>();
private List<FileInfo> videoFiles = new ArrayList<>();
private ProgressDialog progressDialog;
@Override
public int getLayoutResource() {
return R.layout.fragment_media;
}
@Override
public void initView(View view) {
expandableListview = view.findViewById(R.id.expandablelistview);
expandableListview.setGroupIndicator(null);
initData();
setOnClick();
}
private void initData() {
groupList.clear();
bxFilesList.clear();
groupList.add("音频");
groupList.add("视频");
bfm = new FileInfoManager();
progressDialog = new ProgressDialog(getActivity());
progressDialog.setMessage("数据加载中");
progressDialog.setCanceledOnTouchOutside(false);
if (avChooseMap.size() == 0){
for (int i = 0; i < groupList.size(); i++) {
List<FileInfo> bxFiles = new ArrayList<>();
avChooseMap.put(groupList.get(i),bxFiles);
}
}
setAudioData();
}
private void setAudioData() {
//获取
Observable.create(new ObservableOnSubscribe<List<FileInfo>>() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void subscribe(ObservableEmitter<List<FileInfo>> subscriber) throws Exception {
//设置音频
audioFiles = bfm.getMediaFiles(getActivity(), MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
// 设置视频
videoFiles = bfm.getMediaFiles(getActivity(), MediaStore.Audio.Media.EXTERNAL_CONTENT_URI);
subscriber.onComplete();
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new ObserverAdapter<