android使用系统录音并寻找系统录音文件
生活随笔
收集整理的這篇文章主要介紹了
android使用系统录音并寻找系统录音文件
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
判斷系統(tǒng)類
import android.annotation.SuppressLint; import android.os.Build; import android.os.Environment; import android.text.TextUtils;import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.lang.reflect.Method; import java.util.Properties;public final class RomUtils {private static final String[] ROM_HUAWEI = {"huawei"};private static final String[] ROM_VIVO = {"vivo"};private static final String[] ROM_XIAOMI = {"xiaomi"};private static final String[] ROM_OPPO = {"oppo"};private static final String[] ROM_LEECO = {"leeco", "letv"};private static final String[] ROM_360 = {"360", "qiku"};private static final String[] ROM_ZTE = {"zte"};private static final String[] ROM_ONEPLUS = {"oneplus"};private static final String[] ROM_NUBIA = {"nubia"};private static final String[] ROM_COOLPAD = {"coolpad", "yulong"};private static final String[] ROM_LG = {"lg", "lge"};private static final String[] ROM_GOOGLE = {"google"};private static final String[] ROM_SAMSUNG = {"samsung"};private static final String[] ROM_MEIZU = {"meizu"};private static final String[] ROM_LENOVO = {"lenovo"};private static final String[] ROM_SMARTISAN = {"smartisan"};private static final String[] ROM_HTC = {"htc"};private static final String[] ROM_SONY = {"sony"};private static final String[] ROM_GIONEE = {"gionee", "amigo"};private static final String[] ROM_MOTOROLA = {"motorola"};private static final String VERSION_PROPERTY_HUAWEI = "ro.build.version.emui";private static final String VERSION_PROPERTY_VIVO = "ro.vivo.os.build.display.id";private static final String VERSION_PROPERTY_XIAOMI = "ro.build.version.incremental";private static final String VERSION_PROPERTY_OPPO = "ro.build.version.opporom";private static final String VERSION_PROPERTY_LEECO = "ro.letv.release.version";private static final String VERSION_PROPERTY_360 = "ro.build.uiversion";private static final String VERSION_PROPERTY_ZTE = "ro.build.MiFavor_version";private static final String VERSION_PROPERTY_ONEPLUS = "ro.rom.version";private static final String VERSION_PROPERTY_NUBIA = "ro.build.rom.id";private final static String UNKNOWN = "unknown";private static RomInfo bean = null;private RomUtils() {throw new UnsupportedOperationException("u can't instantiate me...");}/*** Return whether the rom is made by huawei.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isHuawei() {return ROM_HUAWEI[0].equals(getRomInfo().name);}/*** Return whether the rom is made by vivo.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isVivo() {return ROM_VIVO[0].equals(getRomInfo().name);}/*** Return whether the rom is made by xiaomi.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isXiaomi() {return ROM_XIAOMI[0].equals(getRomInfo().name);}/*** Return whether the rom is made by oppo.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isOppo() {return ROM_OPPO[0].equals(getRomInfo().name);}/*** Return whether the rom is made by leeco.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isLeeco() {return ROM_LEECO[0].equals(getRomInfo().name);}/*** Return whether the rom is made by 360.** @return {@code true}: yes<br>{@code false}: no*/public static boolean is360() {return ROM_360[0].equals(getRomInfo().name);}/*** Return whether the rom is made by zte.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isZte() {return ROM_ZTE[0].equals(getRomInfo().name);}/*** Return whether the rom is made by oneplus.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isOneplus() {return ROM_ONEPLUS[0].equals(getRomInfo().name);}/*** Return whether the rom is made by nubia.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isNubia() {return ROM_NUBIA[0].equals(getRomInfo().name);}/*** Return whether the rom is made by coolpad.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isCoolpad() {return ROM_COOLPAD[0].equals(getRomInfo().name);}/*** Return whether the rom is made by lg.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isLg() {return ROM_LG[0].equals(getRomInfo().name);}/*** Return whether the rom is made by google.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isGoogle() {return ROM_GOOGLE[0].equals(getRomInfo().name);}/*** Return whether the rom is made by samsung.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isSamsung() {return ROM_SAMSUNG[0].equals(getRomInfo().name);}/*** Return whether the rom is made by meizu.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isMeizu() {return ROM_MEIZU[0].equals(getRomInfo().name);}/*** Return whether the rom is made by lenovo.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isLenovo() {return ROM_LENOVO[0].equals(getRomInfo().name);}/*** Return whether the rom is made by smartisan.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isSmartisan() {return ROM_SMARTISAN[0].equals(getRomInfo().name);}/*** Return whether the rom is made by htc.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isHtc() {return ROM_HTC[0].equals(getRomInfo().name);}/*** Return whether the rom is made by sony.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isSony() {return ROM_SONY[0].equals(getRomInfo().name);}/*** Return whether the rom is made by gionee.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isGionee() {return ROM_GIONEE[0].equals(getRomInfo().name);}/*** Return whether the rom is made by motorola.** @return {@code true}: yes<br>{@code false}: no*/public static boolean isMotorola() {return ROM_MOTOROLA[0].equals(getRomInfo().name);}/*** Return the rom's information.** @return the rom's information*/public static RomInfo getRomInfo() {if (bean != null) return bean;bean = new RomInfo();final String brand = getBrand();final String manufacturer = getManufacturer();if (isRightRom(brand, manufacturer, ROM_HUAWEI)) {bean.name = ROM_HUAWEI[0];String version = getRomVersion(VERSION_PROPERTY_HUAWEI);String[] temp = version.split("_");if (temp.length > 1) {bean.version = temp[1];} else {bean.version = version;}return bean;}if (isRightRom(brand, manufacturer, ROM_VIVO)) {bean.name = ROM_VIVO[0];bean.version = getRomVersion(VERSION_PROPERTY_VIVO);return bean;}if (isRightRom(brand, manufacturer, ROM_XIAOMI)) {bean.name = ROM_XIAOMI[0];bean.version = getRomVersion(VERSION_PROPERTY_XIAOMI);return bean;}if (isRightRom(brand, manufacturer, ROM_OPPO)) {bean.name = ROM_OPPO[0];bean.version = getRomVersion(VERSION_PROPERTY_OPPO);return bean;}if (isRightRom(brand, manufacturer, ROM_LEECO)) {bean.name = ROM_LEECO[0];bean.version = getRomVersion(VERSION_PROPERTY_LEECO);return bean;}if (isRightRom(brand, manufacturer, ROM_360)) {bean.name = ROM_360[0];bean.version = getRomVersion(VERSION_PROPERTY_360);return bean;}if (isRightRom(brand, manufacturer, ROM_ZTE)) {bean.name = ROM_ZTE[0];bean.version = getRomVersion(VERSION_PROPERTY_ZTE);return bean;}if (isRightRom(brand, manufacturer, ROM_ONEPLUS)) {bean.name = ROM_ONEPLUS[0];bean.version = getRomVersion(VERSION_PROPERTY_ONEPLUS);return bean;}if (isRightRom(brand, manufacturer, ROM_NUBIA)) {bean.name = ROM_NUBIA[0];bean.version = getRomVersion(VERSION_PROPERTY_NUBIA);return bean;}if (isRightRom(brand, manufacturer, ROM_COOLPAD)) {bean.name = ROM_COOLPAD[0];} else if (isRightRom(brand, manufacturer, ROM_LG)) {bean.name = ROM_LG[0];} else if (isRightRom(brand, manufacturer, ROM_GOOGLE)) {bean.name = ROM_GOOGLE[0];} else if (isRightRom(brand, manufacturer, ROM_SAMSUNG)) {bean.name = ROM_SAMSUNG[0];} else if (isRightRom(brand, manufacturer, ROM_MEIZU)) {bean.name = ROM_MEIZU[0];} else if (isRightRom(brand, manufacturer, ROM_LENOVO)) {bean.name = ROM_LENOVO[0];} else if (isRightRom(brand, manufacturer, ROM_SMARTISAN)) {bean.name = ROM_SMARTISAN[0];} else if (isRightRom(brand, manufacturer, ROM_HTC)) {bean.name = ROM_HTC[0];} else if (isRightRom(brand, manufacturer, ROM_SONY)) {bean.name = ROM_SONY[0];} else if (isRightRom(brand, manufacturer, ROM_GIONEE)) {bean.name = ROM_GIONEE[0];} else if (isRightRom(brand, manufacturer, ROM_MOTOROLA)) {bean.name = ROM_MOTOROLA[0];} else {bean.name = manufacturer;}bean.version = getRomVersion("");return bean;}private static boolean isRightRom(final String brand, final String manufacturer, final String... names) {for (String name : names) {if (brand.contains(name) || manufacturer.contains(name)) {return true;}}return false;}private static String getManufacturer() {try {String manufacturer = Build.MANUFACTURER;if (!TextUtils.isEmpty(manufacturer)) {return manufacturer.toLowerCase();}} catch (Throwable ignore) {/**/}return UNKNOWN;}private static String getBrand() {try {String brand = Build.BRAND;if (!TextUtils.isEmpty(brand)) {return brand.toLowerCase();}} catch (Throwable ignore) {/**/}return UNKNOWN;}private static String getRomVersion(final String propertyName) {String ret = "";if (!TextUtils.isEmpty(propertyName)) {ret = getSystemProperty(propertyName);}if (TextUtils.isEmpty(ret) || ret.equals(UNKNOWN)) {try {String display = Build.DISPLAY;if (!TextUtils.isEmpty(display)) {ret = display.toLowerCase();}} catch (Throwable ignore) {/**/}}if (TextUtils.isEmpty(ret)) {return UNKNOWN;}return ret;}private static String getSystemProperty(final String name) {String prop = getSystemPropertyByShell(name);if (!TextUtils.isEmpty(prop)) return prop;prop = getSystemPropertyByStream(name);if (!TextUtils.isEmpty(prop)) return prop;if (Build.VERSION.SDK_INT < 28) {return getSystemPropertyByReflect(name);}return prop;}private static String getSystemPropertyByShell(final String propName) {String line;BufferedReader input = null;try {Process p = Runtime.getRuntime().exec("getprop " + propName);input = new BufferedReader(new InputStreamReader(p.getInputStream()), 1024);String ret = input.readLine();if (ret != null) {return ret;}} catch (IOException ignore) {} finally {if (input != null) {try {input.close();} catch (IOException ignore) {/**/}}}return "";}private static String getSystemPropertyByStream(final String key) {try {Properties prop = new Properties();FileInputStream is = new FileInputStream(new File(Environment.getRootDirectory(), "build.prop"));prop.load(is);return prop.getProperty(key, "");} catch (Exception ignore) {/**/}return "";}private static String getSystemPropertyByReflect(String key) {try {@SuppressLint("PrivateApi")Class<?> clz = Class.forName("android.os.SystemProperties");Method getMethod = clz.getMethod("get", String.class, String.class);return (String) getMethod.invoke(clz, key, "");} catch (Exception e) {/**/}return "";}public static class RomInfo {private String name;private String version;public String getName() {return name;}public String getVersion() {return version;}@Overridepublic String toString() {return "RomInfo{name=" + name +", version=" + version + "}";}} }錄音尋找
public class RecordUtil {private final static String record_dir_key = "record_dir_key";private static Disposable disposable;private static int count;//尋找到錄音文件 --- 并存儲錄音文件夾(以便下次拿到錄音文件)private static void saveRecordDir(String dir) {SPTool.put(record_dir_key, dir);}private static String getRecordCacheDir() {return SPTool.getString(record_dir_key, "");}private static void searchRecordDirSync(long time) {if (disposable != null) {disposable.dispose();}disposable = RxUtils.createSimpleObservable(new Callable<Object>() {@Overridepublic Object call() throws Exception {File parent = Environment.getExternalStorageDirectory();File[] files = parent.listFiles();if (files != null && files.length > 0) {for (int i = 0; i < files.length; i++) {if (files[i].isDirectory()) {count = 0;searchRecordFile(time, files[i], count);}}}return "null";}}).subscribe(new Consumer<Object>() {@Overridepublic void accept(Object o) throws Exception {disposable = null;}});}private static File searchRecordDir(long time) {File parent = Environment.getExternalStorageDirectory();File[] files = parent.listFiles();if (files != null && files.length > 0) {for (int i = 0; i < files.length; i++) {if (files[i].isDirectory()) {count = 0;File file = searchRecordFile(time, files[i], count);if (file != null) {return file;}}}}return null;}private static File searchRecordFile(long time, File dir, int count) {//計算調(diào)用次數(shù) --- 層級不必太多if (dir.isDirectory() && isNotRecordAppDir(dir) && count < 4) {File[] files = dir.listFiles();if (files != null && files.length > 0) {for (int i = 0; i < files.length; i++) {File file = files[i];//10秒之內(nèi)生成的文件 默認(rèn)為當(dāng)前的錄音文件if (matchFileNameIsRecord(file.getName()) && file.lastModified() - time > -10 * 1000&& file.length() > 0 && file.isFile()) {saveRecordDir(file.getParent());return file;}if (file.isDirectory()) {return searchRecordFile(time, file, count + 1);}}}}return null;}private static String getSystemRecord() {File parent = Environment.getExternalStorageDirectory();File child;if (RomUtils.isHuawei()) {child = new File(parent, "record");if (!child.exists()) {child = new File(parent, "Sounds/CallRecord");}} else if (RomUtils.isXiaomi()) {child = new File(parent, "MIUI/sound_recorder/call_rec");} else if (RomUtils.isMeizu()) {child = new File(parent, "Recorder");} else if (RomUtils.isOppo()) {child = new File(parent, "Recordings/Call Recordings");if (!child.exists()) {child = new File(parent, "Recordings");}} else if (RomUtils.isVivo()) {child = new File(parent, "Record/Call");} else if (RomUtils.isSamsung()) {child = new File(parent, "Sounds");} else {child = new File(parent, "");}if (!child.exists()) {return null;}return child.getAbsolutePath();}//常用系統(tǒng)錄音文件存放文件夾private static ArrayList<String> getRecordFiles() {String parentPath = Environment.getExternalStorageDirectory().getAbsolutePath();ArrayList<String> list = new ArrayList<>();File file = new File(parentPath, "record");if (file.exists()) {list.add(file.getAbsolutePath());}file = new File(parentPath, "Sounds/CallRecord");if (file.exists()) {list.add(file.getAbsolutePath());}file = new File(parentPath, "MIUI/sound_recorder/call_rec");if (file.exists()) {list.add(file.getAbsolutePath());}file = new File(parentPath, "Recorder");if (file.exists()) {list.add(file.getAbsolutePath());}file = new File(parentPath, "Recordings/Call Recordings");if (file.exists()) {list.add(file.getAbsolutePath());}file = new File(parentPath, "Recordings");if (file.exists()) {list.add(file.getAbsolutePath());}file = new File(parentPath, "Record/Call");if (file.exists()) {list.add(file.getAbsolutePath());}file = new File(parentPath, "Sounds");if (file.exists()) {list.add(file.getAbsolutePath());}//oppp android-10 手機(jī)存儲系統(tǒng)錄音file = new File(parentPath, "Music/Recordings/Call Recordings");if (file.exists()) {list.add(file.getAbsolutePath());}file = new File(parentPath, "PhoneRecord");if (file.exists()) {list.add(file.getAbsolutePath());}// 或者其余機(jī)型系統(tǒng)錄音文件夾 添加return list;}//尋找文件public static File getFile() {try {long time = Calendar.getInstance().getTimeInMillis();File dir;//使用記錄下的文件夾下搜索String recordDir = getRecordCacheDir();LogUtils.e("sp是否有緩存文件%s", "filePath" + recordDir + "當(dāng)前時間" + DateUtils.getCustomTime(time, DateUtils.YYYY_MM_DD_HH_MM_SS));if (TextUtils.isEmpty(recordDir)) {//使用固定系統(tǒng)下文件夾下搜索recordDir = getSystemRecord();if (!TextUtils.isEmpty(recordDir)) {dir = new File(recordDir);File file = getRecordFile(time, dir);if (file != null) {saveRecordDir(file.getParent());return file;}}//使用常用系統(tǒng)下文件夾下搜索ArrayList<String> recordFiles = getRecordFiles();for (int i = 0; i < recordFiles.size(); i++) {dir = new File(recordFiles.get(i));File file = getRecordFile(time, dir);if (file != null) {saveRecordDir(file.getParent());return file;}}} else {//直接使用已存儲文件夾下搜索File file = getRecordFile(time, new File(recordDir));if (file != null) {saveRecordDir(file.getParent());return file;}}//全局搜索錄音文件夾并存儲下來File file = searchRecordDir(time);long time2 = Calendar.getInstance().getTimeInMillis();LogUtils.e("全局搜索錄音文件夾所花時間%s", (time2 - time) + " 當(dāng)前時間" + DateUtils.getCustomTime(time2, DateUtils.YYYY_MM_DD_HH_MM_SS));return file;}catch (Exception e){LogUtils.e(e);}return null;}private static File getRecordFile(long time, File dir) {if (dir.isDirectory() && isNotRecordAppDir(dir)) {File[] files = dir.listFiles();if (files != null && files.length > 0) {for (int i = 0; i < files.length; i++) {File file = files[i];//20秒之內(nèi)生成的文件 默認(rèn)為當(dāng)前的錄音文件(TODO 這里如果需要更準(zhǔn)確可以判斷是否是錄音,錄音時長校對)if (matchFileNameIsRecord(file.getName()) && file.lastModified() - time > -20 * 1000&& file.length() > 0 && file.isFile()) {return file;}}}}return null;}private static boolean isNotRecordAppDir(File dir) {String name = dir.getName();if ("Android".equals(name)) {return false;} else if ("不是錄音文件夾都可以寫在這".equals(name)) {return false;}//加入一些會錄音的app,會生成錄音文件,防止使用其他錄音文件而沒有使用系統(tǒng)錄音文件return true;}private static boolean matchFileNameIsRecord(String name) {//錄音文件匹配規(guī)則 -- 可以自行添加其他格式錄音匹配try {if (name.toLowerCase().endsWith(".mp3".toLowerCase())) {return true;} else if (name.toLowerCase().endsWith(".wav".toLowerCase())) {return true;} else if (name.toLowerCase().endsWith(".3gp".toLowerCase())) {return true;} // else if (name.toLowerCase().endsWith(".mp4".toLowerCase())) { // return true; // }else if (name.toLowerCase().endsWith(".amr".toLowerCase())) {return true;} else if (name.toLowerCase().endsWith(".3gpp".toLowerCase())) {return true;}} catch (Exception e) {LogUtils.e(e);}return false;} }總結(jié)
以上是生活随笔為你收集整理的android使用系统录音并寻找系统录音文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AndroidStudio检测不到模拟器
- 下一篇: apache启动服务失败