笔记69 | Android获取MP3文件的ID3信息工具类

代码块

HelloJni .java

/* =  * Copyright (C) 2009 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.example.hellojni;import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.CharArrayReader;import java.io.DataInputStream;import java.io.DataOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.UnsupportedEncodingException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.ArrayList;import java.util.Calendar;import java.util.List;import java.util.Scanner;import android.app.Activity;import android.app.ActivityManager;import android.app.Instrumentation;import android.app.NotificationManager;import android.app.ActivityManager.RunningTaskInfo;import android.content.BroadcastReceiver;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.content.SharedPreferences;import android.content.pm.PackageManager;import android.content.pm.PackageManager.NameNotFoundException;import android.content.pm.ResolveInfo;import android.content.res.AssetManager;import android.graphics.Bitmap;import android.graphics.Bitmap.Config;import android.graphics.BitmapFactory; import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Rect;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.text.format.DateFormat;import android.util.DisplayMetrics;import android.util.Log;import android.view.Display;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.Surface;import android.view.View;import android.view.WindowManager;import android.view.View.OnClickListener;import android.widget.ImageButton;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;import android.location.LocationManager;import android.net.Uri;import android.net.wifi.WifiManager;import android.os.Bundle;import android.os.Environment;import android.os.Handler;import android.os.Message;import android.os.SystemClock;import android.provider.Settings;public class HelloJni //extends Activity668842{     static {         System.loadLibrary("hello-jni");    }    public static HelloJni pThis;    public native byte[]  getID3info(String fileName,int index);    public boolean isChinese(char c) {        return c >= 0x4E00 && c <= 0x9FA5;    }    public boolean isChinese(String str) {        if (str == null)            return false;        for (char c : str.toCharArray()) {            if (isChinese(c))                return true;         }        return false;    }    public String getID3(String fileName,int index)    {        byte[] get_arr = getID3info(fileName,index);        if(get_arr == null)  return "";        int arr_len = get_arr[1];        Log.i("FDebug","getID3----------------textEncoding="+get_arr[0] + " textSize="+get_arr[1]);        if(arr_len < 1)  return "";        byte[] info_arr = new byte[arr_len];          for(int i=0;i<arr_len;i++)        {            info_arr[i] = get_arr[5+i];        }        if(info_arr != null)        {                       String outStr = "";            for(int i=0;i<info_arr.length;i++)            {                               outStr += " "+Integer.toHexString(info_arr[i]&0xff);            }        //  Log.i("FDebug","getID3----------------outStr="+outStr);            String str = null;            String info = null;            try {                if(get_arr[0] == 0)                {                    str = new String(info_arr,"ISO_8859_1");                    info = new String(str.getBytes("ISO_8859_1"),"gb2312");                     Log.i("FDebug","getID3----------------str="+str);                                               Log.i("FDebug","getID3----------------info="+ info);                    if(isChinese(info))  return info;                }                if(get_arr[0] == 1)                {                    str = new String(info_arr,"UTF-16");                    info = new String(str.getBytes("UTF-16"),"gb2312");                    Log.i("FDebug","getID3----------------str="+str);                                               Log.i("FDebug","getID3----------------info="+ info);                    if(isChinese(info))  return info;                   }                if(get_arr[0] == 2)                {                    str = new String(info_arr,"UTF-16");                    info = new String(str.getBytes("UTF-16"),"gb2312");                     Log.i("FDebug","getID3----------------str="+str);                                               Log.i("FDebug","getID3----------------info="+ info);                    if(isChinese(info))  return info;                   }                if(get_arr[0] == 3)                {                    str = new String(info_arr,"UTF-8");                    //  info = new String(str.getBytes("UTF-8"),"gb2312");                      Log.i("FDebug","getID3----------------str="+str);                                               Log.i("FDebug","getID3----------------info="+ info);                    if(isChinese(info))  return info;                   }                return str;            } catch (UnsupportedEncodingException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }               return "";    }}

获取:

public String g_Title = "";    public String g_Artist = "";    public String g_Album = "";    public String g_Year = "";    public void testID3(String fileName)    {        g_Title = "";        g_Artist = "";        g_Album = "";        HelloJni f = new HelloJni();        g_Title = f.getID3(fileName,0);        g_Artist = f.getID3(fileName,1);        g_Album = f.getID3(fileName,2);    }

原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2018-04-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mukekeheart的iOS之旅

Android基础总结(8)——服务

服务(Service)是Android中实现程序后台运行的解决方案,它非常适合用于去执行哪些不需要和用户交互而且还要长期运行的任务。服务的运行不依赖任何用户界...

3708
来自专栏大内老A

我的WCF之旅(10):如何在WCF进行Exception Handling

在任何Application的开发中,对不可预知的异常进行troubleshooting时,异常处理显得尤为重要。对于一般的.NET系统来说,我们简单地借助tr...

1728
来自专栏猿人谷

SpringMVC中利用@InitBinder来对页面数据进行解析绑定

在使用SpingMVC框架的项目中,经常会遇到页面某些数据类型是Date、Integer、Double等的数据要绑定到控制器的实体,或者控制器需要接受这些数据...

1885
来自专栏Android学习之路

Dagger2使用攻略-基础部分

在这篇文章中,我会介绍 什么是依赖注入,Dagger2是什么,解决什么问题以及基础注解的使用

634
来自专栏Android机动车

Dagger2系列——实例解析

这篇文章会分享一下实际应用中的Dagger2如何使用,以及Dagger2通过apt插件如何给我们生成代码,以及生成的代码之间的关联。

752
来自专栏非著名程序员

Android Service学习之本地服务

Service是在一段不定的时间运行在后台,不和用户交互应用组件。每个Service必须在manifest中 通过<service>来声明。可以通过contec...

1735
来自专栏Phoenix的Android之旅

如何方便的收集app崩溃日志

很多人可能没了解过这个东西可以干嘛用, 其实它的作用是可以传入一个 Handler来捕获那些没有被捕获的异常, 比如 app 层面的 crash。 下面提供了一...

802
来自专栏java初学

android入门 — Service

3117
来自专栏androidBlog

Android Hook 机制之简单实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/de...

1081
来自专栏jianhuicode

如何使用MVP+Dagger2+RxJava+Retrofit开发(1)

概述 在2016年5,6月份开始在知乎上看到开发方法,那时候记得是看mvc,mvp,mvvm这三种开发模式区别,后面进一步了解到google在github上开源...

3648

扫码关注云+社区