Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xiaoxuan_i809
AndroidUtilCode
提交
d1d904d8
A
AndroidUtilCode
项目概览
xiaoxuan_i809
/
AndroidUtilCode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
AndroidUtilCode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
d1d904d8
编写于
8月 06, 2016
作者:
B
blankj
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
delete pre package
上级
acf24c36
变更
17
隐藏空白更改
内联
并排
Showing
17 changed file
with
0 addition
and
2017 deletion
+0
-2017
androidframework/.gitignore
androidframework/.gitignore
+0
-1
androidframework/androidframework.iml
androidframework/androidframework.iml
+0
-110
androidframework/build.gradle
androidframework/build.gradle
+0
-24
androidframework/proguard-rules.pro
androidframework/proguard-rules.pro
+0
-17
androidframework/src/main/AndroidManifest.xml
androidframework/src/main/AndroidManifest.xml
+0
-19
androidframework/src/main/java/com/blankj/androidframework/utils/AppUtils.java
...main/java/com/blankj/androidframework/utils/AppUtils.java
+0
-275
androidframework/src/main/java/com/blankj/androidframework/utils/DeviceUtils.java
...n/java/com/blankj/androidframework/utils/DeviceUtils.java
+0
-74
androidframework/src/main/java/com/blankj/androidframework/utils/EncryptUtils.java
.../java/com/blankj/androidframework/utils/EncryptUtils.java
+0
-160
androidframework/src/main/java/com/blankj/androidframework/utils/KeyboardUtils.java
...java/com/blankj/androidframework/utils/KeyboardUtils.java
+0
-130
androidframework/src/main/java/com/blankj/androidframework/utils/NetworkUtils.java
.../java/com/blankj/androidframework/utils/NetworkUtils.java
+0
-144
androidframework/src/main/java/com/blankj/androidframework/utils/PhoneUtils.java
...in/java/com/blankj/androidframework/utils/PhoneUtils.java
+0
-289
androidframework/src/main/java/com/blankj/androidframework/utils/RegularUtils.java
.../java/com/blankj/androidframework/utils/RegularUtils.java
+0
-123
androidframework/src/main/java/com/blankj/androidframework/utils/ScreenUtils.java
...n/java/com/blankj/androidframework/utils/ScreenUtils.java
+0
-167
androidframework/src/main/java/com/blankj/androidframework/utils/SizeUtils.java
...ain/java/com/blankj/androidframework/utils/SizeUtils.java
+0
-133
androidframework/src/main/java/com/blankj/androidframework/utils/TimeUtils.java
...ain/java/com/blankj/androidframework/utils/TimeUtils.java
+0
-308
androidframework/src/main/java/com/blankj/androidframework/utils/UnclassifiedUtils.java
.../com/blankj/androidframework/utils/UnclassifiedUtils.java
+0
-40
androidframework/src/main/res/values/strings.xml
androidframework/src/main/res/values/strings.xml
+0
-3
未找到文件。
androidframework/.gitignore
已删除
100644 → 0
浏览文件 @
acf24c36
/build
androidframework/androidframework.iml
已删除
100644 → 0
浏览文件 @
acf24c36
<?xml version="1.0" encoding="UTF-8"?>
<module
external.linked.project.id=
":androidframework"
external.linked.project.path=
"$MODULE_DIR$"
external.root.project.path=
"$MODULE_DIR$/.."
external.system.id=
"GRADLE"
external.system.module.group=
"AndroidFramework"
external.system.module.version=
"unspecified"
type=
"JAVA_MODULE"
version=
"4"
>
<component
name=
"FacetManager"
>
<facet
type=
"android-gradle"
name=
"Android-Gradle"
>
<configuration>
<option
name=
"GRADLE_PROJECT_PATH"
value=
":androidframework"
/>
</configuration>
</facet>
<facet
type=
"android"
name=
"Android"
>
<configuration>
<option
name=
"SELECTED_BUILD_VARIANT"
value=
"debug"
/>
<option
name=
"SELECTED_TEST_ARTIFACT"
value=
"_android_test_"
/>
<option
name=
"ASSEMBLE_TASK_NAME"
value=
"assembleDebug"
/>
<option
name=
"COMPILE_JAVA_TASK_NAME"
value=
"compileDebugSources"
/>
<afterSyncTasks>
<task>
generateDebugSources
</task>
</afterSyncTasks>
<option
name=
"ALLOW_USER_CONFIGURATION"
value=
"false"
/>
<option
name=
"MANIFEST_FILE_RELATIVE_PATH"
value=
"/src/main/AndroidManifest.xml"
/>
<option
name=
"RES_FOLDER_RELATIVE_PATH"
value=
"/src/main/res"
/>
<option
name=
"RES_FOLDERS_RELATIVE_PATH"
value=
"file://$MODULE_DIR$/src/main/res"
/>
<option
name=
"ASSETS_FOLDER_RELATIVE_PATH"
value=
"/src/main/assets"
/>
<option
name=
"LIBRARY_PROJECT"
value=
"true"
/>
</configuration>
</facet>
</component>
<component
name=
"NewModuleRootManager"
LANGUAGE_LEVEL=
"JDK_1_7"
inherit-compiler-output=
"false"
>
<output
url=
"file://$MODULE_DIR$/build/intermediates/classes/debug"
/>
<output-test
url=
"file://$MODULE_DIR$/build/intermediates/classes/test/debug"
/>
<exclude-output
/>
<content
url=
"file://$MODULE_DIR$"
>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/source/r/debug"
isTestSource=
"false"
generated=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/source/aidl/debug"
isTestSource=
"false"
generated=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/source/buildConfig/debug"
isTestSource=
"false"
generated=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/source/rs/debug"
isTestSource=
"false"
generated=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/res/rs/debug"
type=
"java-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/res/resValues/debug"
type=
"java-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/source/r/androidTest/debug"
isTestSource=
"true"
generated=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug"
isTestSource=
"true"
generated=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug"
isTestSource=
"true"
generated=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug"
isTestSource=
"true"
generated=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/debug/res"
type=
"java-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/debug/resources"
type=
"java-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/debug/assets"
type=
"java-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/debug/aidl"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/debug/java"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/debug/jni"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/debug/rs"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/debug/shaders"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/testDebug/res"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/testDebug/resources"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/testDebug/assets"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/testDebug/aidl"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/testDebug/java"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/testDebug/jni"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/testDebug/rs"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/testDebug/shaders"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/main/res"
type=
"java-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/main/resources"
type=
"java-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/main/assets"
type=
"java-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/main/aidl"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/main/java"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/main/jni"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/main/rs"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/main/shaders"
isTestSource=
"false"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/test/res"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/test/resources"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/test/assets"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/test/aidl"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/test/java"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/test/jni"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/test/rs"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/test/shaders"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/androidTest/res"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/androidTest/resources"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/androidTest/assets"
type=
"java-test-resource"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/androidTest/aidl"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/androidTest/java"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/androidTest/jni"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/androidTest/rs"
isTestSource=
"true"
/>
<sourceFolder
url=
"file://$MODULE_DIR$/src/androidTest/shaders"
isTestSource=
"true"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/annotations"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/assets"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/blame"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/bundles"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/classes"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/dependency-cache"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/incremental"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/incremental-safeguard"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/jniLibs"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/lint"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/res"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/rs"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/shaders"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/symbols"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/intermediates/transforms"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/outputs"
/>
<excludeFolder
url=
"file://$MODULE_DIR$/build/tmp"
/>
</content>
<orderEntry
type=
"jdk"
jdkName=
"Android API 23 Platform"
jdkType=
"Android SDK"
/>
<orderEntry
type=
"sourceFolder"
forTests=
"false"
/>
<orderEntry
type=
"library"
exported=
""
name=
"support-annotations-23.4.0"
level=
"project"
/>
<orderEntry
type=
"library"
exported=
""
name=
"animated-vector-drawable-23.4.0"
level=
"project"
/>
<orderEntry
type=
"library"
exported=
""
name=
"support-v4-23.4.0"
level=
"project"
/>
<orderEntry
type=
"library"
exported=
""
name=
"support-vector-drawable-23.4.0"
level=
"project"
/>
<orderEntry
type=
"library"
exported=
""
name=
"appcompat-v7-23.4.0"
level=
"project"
/>
</component>
</module>
\ No newline at end of file
androidframework/build.gradle
已删除
100644 → 0
浏览文件 @
acf24c36
apply
plugin:
'com.android.library'
android
{
compileSdkVersion
23
buildToolsVersion
"23.0.3"
defaultConfig
{
minSdkVersion
11
targetSdkVersion
23
versionCode
1
versionName
"1.0"
}
buildTypes
{
release
{
minifyEnabled
false
proguardFiles
getDefaultProguardFile
(
'proguard-android.txt'
),
'proguard-rules.pro'
}
}
}
dependencies
{
compile
fileTree
(
dir:
'libs'
,
include:
[
'*.jar'
])
compile
'com.android.support:appcompat-v7:23.4.0'
}
androidframework/proguard-rules.pro
已删除
100644 → 0
浏览文件 @
acf24c36
# Add project specific ProGuard rules here.
#
By
default
,
the
flags
in
this
file
are
appended
to
flags
specified
#
in
I
:
\
Android_IDE
\
ADT
\
sdk
/
tools
/
proguard
/
proguard
-
android
.
txt
#
You
can
edit
the
include
path
and
order
by
changing
the
proguardFiles
#
directive
in
build
.
gradle
.
#
#
For
more
details
,
see
#
http
://
developer
.
android
.
com
/
guide
/
developing
/
tools
/
proguard
.
html
#
Add
any
project
specific
keep
options
here
:
#
If
your
project
uses
WebView
with
JS
,
uncomment
the
following
#
and
specify
the
fully
qualified
class
name
to
the
JavaScript
interface
#
class
:
#-
keepclassmembers
class
fqcn
.
of
.
javascript
.
interface
.
for
.
webview
{
#
public
*
;
#
}
androidframework/src/main/AndroidManifest.xml
已删除
100644 → 0
浏览文件 @
acf24c36
<manifest
xmlns:android=
"http://schemas.android.com/apk/res/android"
package=
"com.blankj.androidframework"
>
<!--<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>-->
<!--<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>-->
<!--<uses-permission android:name="android.permission.CALL_PHONE"/>-->
<!--<uses-permission android:name="android.permission.READ_PHONE_STATE"/>-->
<!--<uses-permission android:name="android.permission.READ_CONTACTS" />-->
<!--<uses-permission android:name="android.permission.READ_SMS"/>-->
<!--<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>-->
<!--<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />-->
<application
android:allowBackup=
"true"
android:label=
"@string/app_name"
android:supportsRtl=
"true"
>
</application>
</manifest>
androidframework/src/main/java/com/blankj/androidframework/utils/AppUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
android.app.ActivityManager
;
import
android.content.ComponentName
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.content.pm.ApplicationInfo
;
import
android.content.pm.PackageInfo
;
import
android.content.pm.PackageManager
;
import
android.graphics.drawable.Drawable
;
import
android.net.Uri
;
import
android.text.TextUtils
;
import
java.io.File
;
import
java.util.ArrayList
;
import
java.util.List
;
/*********************************************
* author: Blankj on 2016/8/2 1:53
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
AppUtils
{
private
AppUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* 安装指定路径下的Apk
* <p>根据路径名是否符合和文件是否存在判断是否安装成功
* <p>更好的做法应该是startActivityForResult回调判断是否安装成功比较妥当
* <p>这里做不了回调,后续自己做处理
*/
public
static
boolean
installApp
(
Context
context
,
String
filePath
)
{
if
(
filePath
!=
null
&&
filePath
.
length
()
>
4
&&
filePath
.
toLowerCase
().
substring
(
filePath
.
length
()
-
4
).
equals
(
".apk"
))
{
Intent
intent
=
new
Intent
(
Intent
.
ACTION_VIEW
);
File
file
=
new
File
(
filePath
);
if
(
file
.
exists
()
&&
file
.
isFile
()
&&
file
.
length
()
>
0
)
{
intent
.
setDataAndType
(
Uri
.
fromFile
(
file
),
"application/vnd.android.package-archive"
);
intent
.
addFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
context
.
startActivity
(
intent
);
return
true
;
}
}
return
false
;
}
/**
* 卸载指定包名的App
* <p>这里卸载成不成功只判断了packageName是否为空
* <p>如果要根据是否卸载成功应该用startActivityForResult回调判断是否还存在比较妥当
* <p>这里做不了回调,后续自己做处理
*/
public
boolean
uninstallApp
(
Context
context
,
String
packageName
)
{
if
(!
TextUtils
.
isEmpty
(
packageName
))
{
Intent
intent
=
new
Intent
(
Intent
.
ACTION_DELETE
);
intent
.
setData
(
Uri
.
parse
(
"package:"
+
packageName
));
intent
.
addFlags
(
Intent
.
FLAG_ACTIVITY_NEW_TASK
);
context
.
startActivity
(
intent
);
return
true
;
}
return
false
;
}
/**
* 封装App信息的Bean类
*/
public
static
class
AppInfo
{
private
String
name
;
private
Drawable
icon
;
private
String
packagName
;
private
String
versionName
;
private
int
versionCode
;
private
boolean
isSD
;
private
boolean
isUser
;
public
Drawable
getIcon
()
{
return
icon
;
}
public
void
setIcon
(
Drawable
icon
)
{
this
.
icon
=
icon
;
}
public
boolean
isSD
()
{
return
isSD
;
}
public
void
setSD
(
boolean
SD
)
{
isSD
=
SD
;
}
public
boolean
isUser
()
{
return
isUser
;
}
public
void
setUser
(
boolean
user
)
{
isUser
=
user
;
}
public
String
getName
()
{
return
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
public
String
getPackagName
()
{
return
packagName
;
}
public
void
setPackagName
(
String
packagName
)
{
this
.
packagName
=
packagName
;
}
public
int
getVersionCode
()
{
return
versionCode
;
}
public
void
setVersionCode
(
int
versionCode
)
{
this
.
versionCode
=
versionCode
;
}
public
String
getVersionName
()
{
return
versionName
;
}
public
void
setVersionName
(
String
versionName
)
{
this
.
versionName
=
versionName
;
}
/**
* @param name 名称
* @param icon 图标
* @param packagName 包名
* @param versionName 版本号
* @param versionCode 版本Code
* @param isSD 是否安装在SD卡
* @param isUser 是否是用户程序
*/
public
AppInfo
(
String
name
,
Drawable
icon
,
String
packagName
,
String
versionName
,
int
versionCode
,
boolean
isSD
,
boolean
isUser
)
{
this
.
setName
(
name
);
this
.
setIcon
(
icon
);
this
.
setPackagName
(
packagName
);
this
.
setVersionName
(
versionName
);
this
.
setVersionCode
(
versionCode
);
this
.
setSD
(
isSD
);
this
.
setUser
(
isUser
);
}
/*@Override
public String toString() {
return getName() + "\n"
+ getIcon() + "\n"
+ getPackagName() + "\n"
+ getVersionName() + "\n"
+ getVersionCode() + "\n"
+ isSD() + "\n"
+ isUser() + "\n";
}*/
}
/**
* 获取当前App信息
* <p>AppInfo(名称,图标,包名,版本号,版本Code,是否安装在SD卡,是否是用户程序)
*/
public
static
AppInfo
getAppInfo
(
Context
context
)
{
PackageManager
pm
=
context
.
getPackageManager
();
PackageInfo
pi
=
null
;
try
{
pi
=
pm
.
getPackageInfo
(
context
.
getApplicationContext
().
getPackageName
(),
0
);
}
catch
(
PackageManager
.
NameNotFoundException
e
)
{
e
.
printStackTrace
();
}
return
pi
!=
null
?
getBean
(
pm
,
pi
)
:
null
;
}
/**
* 得到AppInfo的Bean
*/
private
static
AppInfo
getBean
(
PackageManager
pm
,
PackageInfo
pi
)
{
ApplicationInfo
ai
=
pi
.
applicationInfo
;
String
name
=
ai
.
loadLabel
(
pm
).
toString
();
Drawable
icon
=
ai
.
loadIcon
(
pm
);
String
packageName
=
pi
.
packageName
;
String
versionName
=
pi
.
versionName
;
int
versionCode
=
pi
.
versionCode
;
boolean
isSD
=
(
ApplicationInfo
.
FLAG_SYSTEM
&
ai
.
flags
)
!=
ApplicationInfo
.
FLAG_SYSTEM
;
boolean
isUser
=
(
ApplicationInfo
.
FLAG_SYSTEM
&
ai
.
flags
)
!=
ApplicationInfo
.
FLAG_SYSTEM
;
return
new
AppInfo
(
name
,
icon
,
packageName
,
versionName
,
versionCode
,
isSD
,
isUser
);
}
/**
* 获取所有已安装App信息
* <p>AppInfo(名称,图标,包名,版本号,版本Code,是否安装在SD卡,是否是用户程序)
* <p>依赖上面的getBean方法
*/
public
static
List
<
AppInfo
>
getAllAppsInfo
(
Context
context
)
{
List
<
AppInfo
>
list
=
new
ArrayList
<>();
PackageManager
pm
=
context
.
getPackageManager
();
// 获取系统中安装的所有软件信息
List
<
PackageInfo
>
installedPackages
=
pm
.
getInstalledPackages
(
0
);
for
(
PackageInfo
pi
:
installedPackages
)
{
if
(
pi
!=
null
)
{
list
.
add
(
getBean
(
pm
,
pi
));
}
}
return
list
;
}
/**
* 打开指定包名的App
*/
public
static
boolean
openAppByPackageName
(
Context
context
,
String
packageName
)
{
if
(!
TextUtils
.
isEmpty
(
packageName
))
{
PackageManager
pm
=
context
.
getPackageManager
();
Intent
launchIntentForPackage
=
pm
.
getLaunchIntentForPackage
(
packageName
);
if
(
launchIntentForPackage
!=
null
)
{
context
.
startActivity
(
launchIntentForPackage
);
return
true
;
}
}
return
false
;
}
/**
* 打开指定包名的App应用信息界面
*/
public
static
boolean
openAppInfo
(
Context
context
,
String
packageName
)
{
if
(!
TextUtils
.
isEmpty
(
packageName
))
{
Intent
intent
=
new
Intent
();
intent
.
setAction
(
"android.settings.APPLICATION_DETAILS_SETTINGS"
);
intent
.
setData
(
Uri
.
parse
(
"package:"
+
packageName
));
context
.
startActivity
(
intent
);
return
true
;
}
return
false
;
}
/**
* 可用来做App信息分享
*/
public
static
void
shareAppInfo
(
Context
context
,
String
info
)
{
if
(!
TextUtils
.
isEmpty
(
info
))
{
Intent
intent
=
new
Intent
(
Intent
.
ACTION_SEND
);
intent
.
setType
(
"text/plain"
);
intent
.
putExtra
(
Intent
.
EXTRA_TEXT
,
info
);
context
.
startActivity
(
intent
);
}
}
/**
* 判断当前App处于前台还是后台
* <p>需添加<uses-permission android:name="android.permission.GET_TASKS"/>
* <p>并且必须是系统应用该方法才有效
*/
public
static
boolean
isAppBackground
(
Context
context
)
{
ActivityManager
am
=
(
ActivityManager
)
context
.
getSystemService
(
Context
.
ACTIVITY_SERVICE
);
@SuppressWarnings
(
"deprecation"
)
List
<
ActivityManager
.
RunningTaskInfo
>
tasks
=
am
.
getRunningTasks
(
1
);
if
(!
tasks
.
isEmpty
())
{
ComponentName
topActivity
=
tasks
.
get
(
0
).
topActivity
;
if
(!
topActivity
.
getPackageName
().
equals
(
context
.
getPackageName
()))
{
return
true
;
}
}
return
false
;
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/DeviceUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
android.content.Context
;
import
android.net.wifi.WifiInfo
;
import
android.net.wifi.WifiManager
;
import
android.os.Build
;
import
android.os.Environment
;
import
java.io.File
;
/*********************************************
* author: Blankj on 2016/8/1 19:43
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
DeviceUtils
{
private
DeviceUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* 获取设备MAC地址
* <p>需添加权限<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
*/
public
static
String
getMacAddress
(
Context
context
)
{
String
macAddress
;
WifiManager
wifi
=
(
WifiManager
)
context
.
getSystemService
(
Context
.
WIFI_SERVICE
);
WifiInfo
info
=
wifi
.
getConnectionInfo
();
macAddress
=
info
.
getMacAddress
();
if
(
null
==
macAddress
)
{
return
""
;
}
macAddress
=
macAddress
.
replace
(
":"
,
""
);
return
macAddress
;
}
/**
* 获取设备厂商,如Xiaomi
*/
public
static
String
getManufacturer
()
{
String
MANUFACTURER
=
Build
.
MANUFACTURER
;
return
MANUFACTURER
;
}
/**
* 获取设备型号,如MI2SC
*/
public
static
String
getModel
()
{
String
model
=
Build
.
MODEL
;
if
(
model
!=
null
)
{
model
=
model
.
trim
().
replaceAll
(
"\\s*"
,
""
);
}
else
{
model
=
""
;
}
return
model
;
}
/**
* 获取设备SD卡是否可用
*/
public
static
boolean
isSDCardEnable
()
{
return
Environment
.
MEDIA_MOUNTED
.
equals
(
Environment
.
getExternalStorageState
());
}
/**
* 获取设备SD卡路径
* <p>一般是/storage/emulated/0/
*/
public
static
String
getSDCardPath
()
{
return
Environment
.
getExternalStorageDirectory
().
getAbsolutePath
()
+
File
.
separator
;
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/EncryptUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
java.io.FileInputStream
;
import
java.io.IOException
;
import
java.security.MessageDigest
;
import
java.security.NoSuchAlgorithmException
;
/*********************************************
* author: Blankj on 2016/8/2 21:22
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
EncryptUtils
{
private
EncryptUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* MD5加密
*
* @param data 明文字符串
* @return 密文
*/
public
static
String
getMD5
(
String
data
)
{
return
getMD5
(
data
.
getBytes
());
}
/**
* MD5加密
*
* @param data 明文字符串
* @param salt 盐
* @return 密文
*/
public
static
String
getMD5
(
String
data
,
String
salt
)
{
return
bytes2Hex
(
encryptMD5
((
data
+
salt
).
getBytes
()));
}
/**
* MD5加密
*
* @param data 明文字节数组
* @return 密文
*/
public
static
String
getMD5
(
byte
[]
data
)
{
return
bytes2Hex
(
encryptMD5
(
data
));
}
/**
* MD5加密
*
* @param data 明文字节数组
* @param salt 盐字节数组
* @return 密文
*/
public
static
String
getMD5
(
byte
[]
data
,
byte
[]
salt
)
{
byte
[]
dataSalt
=
new
byte
[
data
.
length
+
salt
.
length
];
System
.
arraycopy
(
data
,
0
,
dataSalt
,
0
,
data
.
length
);
System
.
arraycopy
(
salt
,
0
,
dataSalt
,
data
.
length
,
salt
.
length
);
return
bytes2Hex
(
encryptMD5
(
dataSalt
));
}
/**
* MD5加密
*
* @param data 明文字节数组
* @return 密文字节数组
*/
public
static
byte
[]
encryptMD5
(
byte
[]
data
)
{
try
{
MessageDigest
md
=
MessageDigest
.
getInstance
(
"MD5"
);
md
.
update
(
data
);
return
md
.
digest
();
}
catch
(
NoSuchAlgorithmException
e
)
{
e
.
printStackTrace
();
}
return
new
byte
[
0
];
}
/**
* 获取文件的MD5校验码
*
* @param filePath 文件路径
* @return 文件的MD5校验码
*/
public
static
String
getMD5File
(
String
filePath
)
{
FileInputStream
in
=
null
;
try
{
MessageDigest
md
=
MessageDigest
.
getInstance
(
"MD5"
);
in
=
new
FileInputStream
(
filePath
);
int
len
;
byte
[]
buffer
=
new
byte
[
1024
];
while
((
len
=
in
.
read
(
buffer
))
!=
-
1
)
{
md
.
update
(
buffer
,
0
,
len
);
}
return
bytes2Hex
(
md
.
digest
());
}
catch
(
NoSuchAlgorithmException
|
IOException
e
)
{
e
.
printStackTrace
();
}
finally
{
if
(
in
!=
null
)
{
try
{
in
.
close
();
}
catch
(
IOException
ignored
)
{
}
}
}
return
""
;
}
/**
* SHA加密
*
* @param data 明文字符串
* @return 密文
*/
public
static
String
getSHA
(
String
data
)
{
return
getSHA
(
data
.
getBytes
());
}
/**
* SHA加密
*
* @param data 明文字节数组
* @return 密文
*/
public
static
String
getSHA
(
byte
[]
data
)
{
return
bytes2Hex
(
encryptSHA
(
data
));
}
/**
* SHA加密
*
* @param data 明文字节数组
* @return 密文字节数组
*/
public
static
byte
[]
encryptSHA
(
byte
[]
data
)
{
try
{
MessageDigest
md
=
MessageDigest
.
getInstance
(
"SHA"
);
md
.
update
(
data
);
return
md
.
digest
();
}
catch
(
NoSuchAlgorithmException
e
)
{
e
.
printStackTrace
();
}
return
new
byte
[
0
];
}
/**
* 一个byte转为2个hex字符
*/
public
static
String
bytes2Hex
(
byte
[]
src
)
{
char
[]
res
=
new
char
[
src
.
length
*
2
];
final
char
hexDigits
[]
=
{
'0'
,
'1'
,
'2'
,
'3'
,
'4'
,
'5'
,
'6'
,
'7'
,
'8'
,
'9'
,
'A'
,
'B'
,
'C'
,
'D'
,
'E'
,
'F'
};
for
(
int
i
=
0
,
j
=
0
;
i
<
src
.
length
;
i
++)
{
res
[
j
++]
=
hexDigits
[
src
[
i
]
>>>
4
&
0x0f
];
res
[
j
++]
=
hexDigits
[
src
[
i
]
&
0x0f
];
}
return
new
String
(
res
);
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/KeyboardUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.util.Log
;
import
android.view.View
;
import
android.view.inputmethod.InputMethodManager
;
import
android.widget.EditText
;
/*********************************************
* author: Blankj on 2016/8/2 21:18
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
KeyboardUtils
{
private
KeyboardUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* 动态隐藏软键盘
*/
public
static
void
hideSoftInput
(
Activity
activity
)
{
View
view
=
activity
.
getWindow
().
peekDecorView
();
if
(
view
!=
null
)
{
InputMethodManager
inputmanger
=
(
InputMethodManager
)
activity
.
getSystemService
(
Context
.
INPUT_METHOD_SERVICE
);
inputmanger
.
hideSoftInputFromWindow
(
view
.
getWindowToken
(),
0
);
}
}
/**
* 动态隐藏软键盘
*/
public
static
void
hideSoftInput
(
Context
context
,
EditText
edit
)
{
edit
.
clearFocus
();
InputMethodManager
inputmanger
=
(
InputMethodManager
)
context
.
getSystemService
(
Context
.
INPUT_METHOD_SERVICE
);
inputmanger
.
hideSoftInputFromWindow
(
edit
.
getWindowToken
(),
0
);
}
/**
* 点击屏幕空白区域隐藏软键盘(方法1)
* <p>在onTouch中处理,未获焦点则隐藏
* <p>参照以下注释代码
*/
public
static
void
clickBlankArea2HideSoftInput0
()
{
Log
.
i
(
"tips"
,
"U should copy the following code."
);
/*
@Override
public boolean onTouchEvent (MotionEvent event){
if (null != this.getCurrentFocus()) {
InputMethodManager mInputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
return mInputMethodManager.hideSoftInputFromWindow(this.getCurrentFocus().getWindowToken(), 0);
}
return super.onTouchEvent(event);
}
*/
}
/**
* 点击屏幕空白区域隐藏软键盘(方法2)
* <p>根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘
* <p>需重写dispatchTouchEvent
* <p>参照以下注释代码
*/
public
static
void
clickBlankArea2HideSoftInput1
()
{
Log
.
i
(
"tips"
,
"U should copy the following code."
);
/*
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
View v = getCurrentFocus();
if (isShouldHideKeyboard(v, ev)) {
hideKeyboard(v.getWindowToken());
}
}
return super.dispatchTouchEvent(ev);
}
// 根据EditText所在坐标和用户点击的坐标相对比,来判断是否隐藏键盘
private boolean isShouldHideKeyboard(View v, MotionEvent event) {
if (v != null && (v instanceof EditText)) {
int[] l = {0, 0};
v.getLocationInWindow(l);
int left = l[0],
top = l[1],
bottom = top + v.getHeight(),
right = left + v.getWidth();
return !(event.getX() > left && event.getX() < right
&& event.getY() > top && event.getY() < bottom);
}
return false;
}
// 获取InputMethodManager,隐藏软键盘
private void hideKeyboard(IBinder token) {
if (token != null) {
InputMethodManager im = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
im.hideSoftInputFromWindow(token, InputMethodManager.HIDE_NOT_ALWAYS);
}
}
*/
}
/**
* 动态显示软键盘
*/
public
static
void
showSoftInput
(
Context
context
,
EditText
edit
)
{
edit
.
setFocusable
(
true
);
edit
.
setFocusableInTouchMode
(
true
);
edit
.
requestFocus
();
InputMethodManager
inputManager
=
(
InputMethodManager
)
context
.
getSystemService
(
Context
.
INPUT_METHOD_SERVICE
);
inputManager
.
showSoftInput
(
edit
,
0
);
}
/**
* 切换键盘显示与否状态
*/
public
static
void
toggleSoftInput
(
Context
context
,
EditText
edit
)
{
edit
.
setFocusable
(
true
);
edit
.
setFocusableInTouchMode
(
true
);
edit
.
requestFocus
();
InputMethodManager
inputManager
=
(
InputMethodManager
)
context
.
getSystemService
(
Context
.
INPUT_METHOD_SERVICE
);
inputManager
.
toggleSoftInput
(
InputMethodManager
.
SHOW_FORCED
,
0
);
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/NetworkUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
android.app.Activity
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.net.ConnectivityManager
;
import
android.net.NetworkInfo
;
import
android.telephony.TelephonyManager
;
/*********************************************
* author: Blankj on 2016/8/1 21:33
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
NetworkUtils
{
private
NetworkUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* 打开网络设置界面
* <p>3.0以下打开设置界面
*/
public
static
void
openWirelessSettings
(
Context
context
)
{
if
(
android
.
os
.
Build
.
VERSION
.
SDK_INT
>
10
)
{
context
.
startActivity
(
new
Intent
(
android
.
provider
.
Settings
.
ACTION_SETTINGS
));
}
else
{
context
.
startActivity
(
new
Intent
(
android
.
provider
.
Settings
.
ACTION_WIRELESS_SETTINGS
));
}
}
/**
* 判断是否网络连接
* <p>需添加权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
*/
public
static
boolean
isConnected
(
Context
context
)
{
ConnectivityManager
cm
=
(
ConnectivityManager
)
context
.
getSystemService
(
Activity
.
CONNECTIVITY_SERVICE
);
NetworkInfo
info
=
cm
.
getActiveNetworkInfo
();
return
info
!=
null
&&
info
.
isConnected
();
}
/**
* 判断wifi是否连接状态
* <p>需添加权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
*/
public
static
boolean
isWifiConnected
(
Context
context
)
{
ConnectivityManager
cm
=
(
ConnectivityManager
)
context
.
getSystemService
(
Context
.
CONNECTIVITY_SERVICE
);
return
cm
!=
null
&&
cm
.
getActiveNetworkInfo
().
getType
()
==
ConnectivityManager
.
TYPE_WIFI
;
}
/**
* 获取移动网络运营商名称
* <p>如中国联通、中国移动、中国电信
*/
public
static
String
getNetworkOperatorName
(
Context
context
)
{
TelephonyManager
tm
=
(
TelephonyManager
)
context
.
getSystemService
(
Context
.
TELEPHONY_SERVICE
);
return
tm
!=
null
?
tm
.
getNetworkOperatorName
()
:
null
;
}
/**
* 获取移动终端类型
* <pre>
* PHONE_TYPE_NONE : 0 手机制式未知
* PHONE_TYPE_GSM : 1 手机制式为GSM,移动和联通
* PHONE_TYPE_CDMA : 2 手机制式为CDMA,电信
* PHONE_TYPE_SIP : 3
* <pre/>
*/
public
static
int
getPhoneType
(
Context
context
)
{
TelephonyManager
tm
=
(
TelephonyManager
)
context
.
getSystemService
(
Context
.
TELEPHONY_SERVICE
);
return
tm
!=
null
?
tm
.
getPhoneType
()
:
-
1
;
}
/**
* 获取手机连接的网络类型(2G,3G,4G)
* <p>联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EGDE,电信的2G为CDMA,电信的3G为EVDO
*/
public
static
int
getNetworkTpye
(
Context
context
)
{
TelephonyManager
tm
=
(
TelephonyManager
)
context
.
getSystemService
(
Context
.
TELEPHONY_SERVICE
);
switch
(
tm
.
getNetworkType
())
{
case
TelephonyManager
.
NETWORK_TYPE_GPRS
:
case
TelephonyManager
.
NETWORK_TYPE_EDGE
:
case
TelephonyManager
.
NETWORK_TYPE_CDMA
:
case
TelephonyManager
.
NETWORK_TYPE_1xRTT
:
case
TelephonyManager
.
NETWORK_TYPE_IDEN
:
return
Constants
.
NETWORK_CLASS_2_G
;
case
TelephonyManager
.
NETWORK_TYPE_UMTS
:
case
TelephonyManager
.
NETWORK_TYPE_EVDO_0
:
case
TelephonyManager
.
NETWORK_TYPE_EVDO_A
:
case
TelephonyManager
.
NETWORK_TYPE_HSDPA
:
case
TelephonyManager
.
NETWORK_TYPE_HSUPA
:
case
TelephonyManager
.
NETWORK_TYPE_HSPA
:
case
TelephonyManager
.
NETWORK_TYPE_EVDO_B
:
case
TelephonyManager
.
NETWORK_TYPE_EHRPD
:
case
TelephonyManager
.
NETWORK_TYPE_HSPAP
:
return
Constants
.
NETWORK_CLASS_3_G
;
case
TelephonyManager
.
NETWORK_TYPE_LTE
:
return
Constants
.
NETWORK_CLASS_4_G
;
default
:
return
Constants
.
NETWORK_CLASS_UNKNOWN
;
}
}
public
class
Constants
{
// Unknown network class
public
static
final
int
NETWORK_CLASS_UNKNOWN
=
0
;
// wifi network
public
static
final
int
NETWORK_WIFI
=
1
;
// "2G" networks
public
static
final
int
NETWORK_CLASS_2_G
=
2
;
// "3G" networks
public
static
final
int
NETWORK_CLASS_3_G
=
3
;
// "4G" networks
public
static
final
int
NETWORK_CLASS_4_G
=
4
;
}
/**
* 获取当前手机的网络类型(WIFI,2G,3G,4G)
* <p>需添加权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
* <p>需要用到上面的方法
*/
public
static
int
getCurNetworkType
(
Context
context
)
{
int
netWorkType
=
Constants
.
NETWORK_CLASS_UNKNOWN
;
ConnectivityManager
cm
=
(
ConnectivityManager
)
context
.
getSystemService
(
Context
.
CONNECTIVITY_SERVICE
);
NetworkInfo
networkInfo
=
cm
.
getActiveNetworkInfo
();
if
(
networkInfo
!=
null
&&
networkInfo
.
isConnected
())
{
int
type
=
networkInfo
.
getType
();
if
(
type
==
ConnectivityManager
.
TYPE_WIFI
)
{
netWorkType
=
Constants
.
NETWORK_WIFI
;
}
else
if
(
type
==
ConnectivityManager
.
TYPE_MOBILE
)
{
netWorkType
=
getNetworkTpye
(
context
);
}
}
return
netWorkType
;
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/PhoneUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
android.content.ContentResolver
;
import
android.content.Context
;
import
android.content.Intent
;
import
android.database.Cursor
;
import
android.net.Uri
;
import
android.os.SystemClock
;
import
android.provider.Settings
;
import
android.telephony.TelephonyManager
;
import
android.text.TextUtils
;
import
android.util.Log
;
import
android.util.Xml
;
import
org.xmlpull.v1.XmlSerializer
;
import
java.io.File
;
import
java.io.FileOutputStream
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
/*********************************************
* author: Blankj on 2016/8/1 19:57
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
PhoneUtils
{
private
PhoneUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* 判断设备是否是手机
*/
public
static
boolean
isPhone
(
Context
context
)
{
TelephonyManager
tm
=
(
TelephonyManager
)
context
.
getSystemService
(
Context
.
TELEPHONY_SERVICE
);
return
tm
.
getPhoneType
()
!=
TelephonyManager
.
PHONE_TYPE_NONE
;
}
/**
* 获取当前设备的IMIE
* <p>需与上面的isPhone一起使用
* <p>需添加权限<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
*/
public
static
String
getDeviceIMEI
(
Context
context
)
{
String
deviceId
;
if
(
isPhone
(
context
))
{
TelephonyManager
tm
=
(
TelephonyManager
)
context
.
getSystemService
(
Context
.
TELEPHONY_SERVICE
);
deviceId
=
tm
.
getDeviceId
();
}
else
{
deviceId
=
Settings
.
Secure
.
getString
(
context
.
getContentResolver
(),
Settings
.
Secure
.
ANDROID_ID
);
}
return
deviceId
;
}
/**
* 获取手机状态信息
* <p>需添加权限<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
* <p>返回如下
* <pre>
* DeviceId(IMEI) = 99000311726612
* DeviceSoftwareVersion = 00
* Line1Number =
* NetworkCountryIso = cn
* NetworkOperator = 46003
* NetworkOperatorName = 中国电信
* NetworkType = 6
* honeType = 2
* SimCountryIso = cn
* SimOperator = 46003
* SimOperatorName = 中国电信
* SimSerialNumber = 89860315045710604022
* SimState = 5
* SubscriberId(IMSI) = 460030419724900
* VoiceMailNumber = *86
* <pre/>
*/
public
static
String
getPhoneStatus
(
Context
context
)
{
TelephonyManager
tm
=
(
TelephonyManager
)
context
.
getSystemService
(
Context
.
TELEPHONY_SERVICE
);
String
str
=
""
;
str
+=
"DeviceId(IMEI) = "
+
tm
.
getDeviceId
()
+
"\n"
;
str
+=
"DeviceSoftwareVersion = "
+
tm
.
getDeviceSoftwareVersion
()
+
"\n"
;
str
+=
"Line1Number = "
+
tm
.
getLine1Number
()
+
"\n"
;
str
+=
"NetworkCountryIso = "
+
tm
.
getNetworkCountryIso
()
+
"\n"
;
str
+=
"NetworkOperator = "
+
tm
.
getNetworkOperator
()
+
"\n"
;
str
+=
"NetworkOperatorName = "
+
tm
.
getNetworkOperatorName
()
+
"\n"
;
str
+=
"NetworkType = "
+
tm
.
getNetworkType
()
+
"\n"
;
str
+=
"honeType = "
+
tm
.
getPhoneType
()
+
"\n"
;
str
+=
"SimCountryIso = "
+
tm
.
getSimCountryIso
()
+
"\n"
;
str
+=
"SimOperator = "
+
tm
.
getSimOperator
()
+
"\n"
;
str
+=
"SimOperatorName = "
+
tm
.
getSimOperatorName
()
+
"\n"
;
str
+=
"SimSerialNumber = "
+
tm
.
getSimSerialNumber
()
+
"\n"
;
str
+=
"SimState = "
+
tm
.
getSimState
()
+
"\n"
;
str
+=
"SubscriberId(IMSI) = "
+
tm
.
getSubscriberId
()
+
"\n"
;
str
+=
"VoiceMailNumber = "
+
tm
.
getVoiceMailNumber
()
+
"\n"
;
return
str
;
}
/**
* 跳至填充好phoneNumber的拨号界面
*/
public
static
void
dial
(
Context
context
,
String
phoneNumber
)
{
context
.
startActivity
(
new
Intent
(
Intent
.
ACTION_DIAL
,
Uri
.
parse
(
"tel:"
+
phoneNumber
)));
}
/**
* 拨打phoneNumber
* <p>需添加权限<uses-permission android:name="android.permission.CALL_PHONE"/>
*/
public
static
void
call
(
Context
context
,
String
phoneNumber
)
{
context
.
startActivity
(
new
Intent
(
"android.intent.action.CALL"
,
Uri
.
parse
(
"tel:"
+
phoneNumber
)));
}
/**
* 发送短信
*/
public
static
void
sendSms
(
Context
context
,
String
phoneNumber
,
String
content
)
{
Uri
uri
=
Uri
.
parse
(
"smsto:"
+
(
TextUtils
.
isEmpty
(
phoneNumber
)
?
""
:
phoneNumber
));
Intent
intent
=
new
Intent
(
Intent
.
ACTION_SENDTO
,
uri
);
intent
.
putExtra
(
"sms_body"
,
TextUtils
.
isEmpty
(
content
)
?
""
:
content
);
context
.
startActivity
(
intent
);
}
/**
* 获取手机联系人
* <p>需添加权限<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
* <p>需添加权限<uses-permission android:name="android.permission.READ_CONTACTS" />
*/
public
static
List
<
HashMap
<
String
,
String
>>
getAllContactInfo
(
Context
context
)
{
SystemClock
.
sleep
(
3000
);
ArrayList
<
HashMap
<
String
,
String
>>
list
=
new
ArrayList
<
HashMap
<
String
,
String
>>();
// 1.获取内容解析者
ContentResolver
resolver
=
context
.
getContentResolver
();
// 2.获取内容提供者的地址:com.android.contacts
// raw_contacts表的地址 :raw_contacts
// view_data表的地址 : data
// 3.生成查询地址
Uri
raw_uri
=
Uri
.
parse
(
"content://com.android.contacts/raw_contacts"
);
Uri
date_uri
=
Uri
.
parse
(
"content://com.android.contacts/data"
);
// 4.查询操作,先查询raw_contacts,查询contact_id
// projection : 查询的字段
Cursor
cursor
=
resolver
.
query
(
raw_uri
,
new
String
[]{
"contact_id"
},
null
,
null
,
null
);
// 5.解析cursor
while
(
cursor
.
moveToNext
())
{
// 6.获取查询的数据
String
contact_id
=
cursor
.
getString
(
0
);
// cursor.getString(cursor.getColumnIndex("contact_id"));//getColumnIndex
// : 查询字段在cursor中索引值,一般都是用在查询字段比较多的时候
// 判断contact_id是否为空
if
(!
TextUtils
.
isEmpty
(
contact_id
))
{
//null ""
// 7.根据contact_id查询view_data表中的数据
// selection : 查询条件
// selectionArgs :查询条件的参数
// sortOrder : 排序
// 空指针: 1.null.方法 2.参数为null
Cursor
c
=
resolver
.
query
(
date_uri
,
new
String
[]{
"data1"
,
"mimetype"
},
"raw_contact_id=?"
,
new
String
[]{
contact_id
},
null
);
HashMap
<
String
,
String
>
map
=
new
HashMap
<
String
,
String
>();
// 8.解析c
while
(
c
.
moveToNext
())
{
// 9.获取数据
String
data1
=
c
.
getString
(
0
);
String
mimetype
=
c
.
getString
(
1
);
// 10.根据类型去判断获取的data1数据并保存
if
(
mimetype
.
equals
(
"vnd.android.cursor.item/phone_v2"
))
{
// 电话
map
.
put
(
"phone"
,
data1
);
}
else
if
(
mimetype
.
equals
(
"vnd.android.cursor.item/name"
))
{
// 姓名
map
.
put
(
"name"
,
data1
);
}
}
// 11.添加到集合中数据
list
.
add
(
map
);
// 12.关闭cursor
c
.
close
();
}
}
// 12.关闭cursor
cursor
.
close
();
return
list
;
}
/**
* 打开手机联系人界面点击联系人后便获取该号码
* <p>参照以下注释代码
*/
public
static
void
getContantNum
()
{
Log
.
i
(
"tips"
,
"U should copy the following code."
);
/*
Intent intent = new Intent();
intent.setAction("android.intent.action.PICK");
intent.setType("vnd.android.cursor.dir/phone_v2");
startActivityForResult(intent, 0);
@Override
protected void onActivityResult ( int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
if (data != null) {
Uri uri = data.getData();
String num = null;
// 创建内容解析者
ContentResolver contentResolver = getContentResolver();
Cursor cursor = contentResolver.query(uri,
null, null, null, null);
while (cursor.moveToNext()) {
num = cursor.getString(cursor.getColumnIndex("data1"));
}
cursor.close();
num = num.replaceAll("-", "");//替换的操作,555-6 -> 5556
}
}
*/
}
/**
* 获取手机短信并保存到xml中
* <p>需添加权限<uses-permission android:name="android.permission.READ_SMS"/>
* <p>需添加权限<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
*/
public
static
void
getAllSMS
(
Context
context
)
{
//1.获取短信
//1.1获取内容解析者
ContentResolver
resolver
=
context
.
getContentResolver
();
//1.2获取内容提供者地址 sms,sms表的地址:null 不写
//1.3获取查询路径
Uri
uri
=
Uri
.
parse
(
"content://sms"
);
//1.4.查询操作
//projection : 查询的字段
//selection : 查询的条件
//selectionArgs : 查询条件的参数
//sortOrder : 排序
Cursor
cursor
=
resolver
.
query
(
uri
,
new
String
[]{
"address"
,
"date"
,
"type"
,
"body"
},
null
,
null
,
null
);
//设置最大进度
int
count
=
cursor
.
getCount
();
//获取短信的个数
//2.备份短信
//2.1获取xml序列器
XmlSerializer
xmlSerializer
=
Xml
.
newSerializer
();
try
{
//2.2设置xml文件保存的路径
//os : 保存的位置
//encoding : 编码格式
xmlSerializer
.
setOutput
(
new
FileOutputStream
(
new
File
(
"/mnt/sdcard/backupsms.xml"
)),
"utf-8"
);
//2.3设置头信息
//standalone : 是否独立保存
xmlSerializer
.
startDocument
(
"utf-8"
,
true
);
//2.4设置根标签
xmlSerializer
.
startTag
(
null
,
"smss"
);
//1.5.解析cursor
while
(
cursor
.
moveToNext
())
{
SystemClock
.
sleep
(
1000
);
//2.5设置短信的标签
xmlSerializer
.
startTag
(
null
,
"sms"
);
//2.6设置文本内容的标签
xmlSerializer
.
startTag
(
null
,
"address"
);
String
address
=
cursor
.
getString
(
0
);
//2.7设置文本内容
xmlSerializer
.
text
(
address
);
xmlSerializer
.
endTag
(
null
,
"address"
);
xmlSerializer
.
startTag
(
null
,
"date"
);
String
date
=
cursor
.
getString
(
1
);
xmlSerializer
.
text
(
date
);
xmlSerializer
.
endTag
(
null
,
"date"
);
xmlSerializer
.
startTag
(
null
,
"type"
);
String
type
=
cursor
.
getString
(
2
);
xmlSerializer
.
text
(
type
);
xmlSerializer
.
endTag
(
null
,
"type"
);
xmlSerializer
.
startTag
(
null
,
"body"
);
String
body
=
cursor
.
getString
(
3
);
xmlSerializer
.
text
(
body
);
xmlSerializer
.
endTag
(
null
,
"body"
);
xmlSerializer
.
endTag
(
null
,
"sms"
);
System
.
out
.
println
(
"address:"
+
address
+
" date:"
+
date
+
" type:"
+
type
+
" body:"
+
body
);
}
xmlSerializer
.
endTag
(
null
,
"smss"
);
xmlSerializer
.
endDocument
();
//2.8将数据刷新到文件中
xmlSerializer
.
flush
();
}
catch
(
Exception
e
)
{
// TODO Auto-generated catch block
e
.
printStackTrace
();
}
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/RegularUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
android.text.TextUtils
;
import
java.util.regex.Pattern
;
/*********************************************
* author: Blankj on 2016/8/2 21:19
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
RegularUtils
{
private
RegularUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* 验证手机号(简单)
*/
private
static
final
String
REGEX_MOBILE_SIMPLE
=
"^[1]\\d{10}$"
;
/**
* 验证手机号(精确)
* <p>
* <p>移动:134(0-8)、135、136、137、138、139、147、150、151、152、157、158、159、178、182、183、184、187、188
* <p>联通:130、131、132、145、155、156、175、176、185、186
* <p>电信:133、153、173、177、180、181、189
* <p>全球星:1349
* <p>虚拟运营商:170
*/
private
static
final
String
REGEX_MOBILE_EXACT
=
"^((13[0-9])|(14[5,7])|(15[0-3,5-8])|(17[0,3,5-8])|(18[0-9])|(147))\\d{8}$"
;
/**
* 验证座机号,正确格式:xxx/xxxx-xxxxxxx/xxxxxxxx/
*/
private
static
final
String
REGEX_TEL
=
"^0\\d{2,3}[- ]?\\d{7,8}"
;
/**
* 验证邮箱
*/
private
static
final
String
REGEX_EMAIL
=
"^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$"
;
/**
* 验证url
*/
private
static
final
String
REGEX_URL
=
"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?"
;
/**
* 验证汉字
*/
private
static
final
String
REGEX_CHZ
=
"^[\\u4e00-\\u9fa5]+$"
;
/**
* 验证用户名,取值范围为a-z,A-Z,0-9,"_",汉字,不能以"_"结尾,用户名必须是6-20位
*/
private
static
final
String
REGEX_USERNAME
=
"^[\\w\\u4e00-\\u9fa5]{6,20}(?<!_)$"
;
/**
* 验证IP地址
*/
private
static
final
String
REGEX_IP
=
"((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)"
;
//If u want more please visit http://toutiao.com/i6231678548520731137/
/**
* @param string 待验证文本
* @return 是否符合手机号(简单)格式
*/
public
static
boolean
isMobileSimple
(
String
string
)
{
return
isMatch
(
REGEX_MOBILE_SIMPLE
,
string
);
}
/**
* @param string 待验证文本
* @return 是否符合手机号(精确)格式
*/
public
static
boolean
isMobileExact
(
String
string
)
{
return
isMatch
(
REGEX_MOBILE_EXACT
,
string
);
}
/**
* @param string 待验证文本
* @return 是否符合座机号码格式
*/
public
static
boolean
isTel
(
String
string
)
{
return
isMatch
(
REGEX_TEL
,
string
);
}
/**
* @param string 待验证文本
* @return 是否符合邮箱格式
*/
public
static
boolean
isEmail
(
String
string
)
{
return
isMatch
(
REGEX_EMAIL
,
string
);
}
/**
* @param string 待验证文本
* @return 是否符合网址格式
*/
public
static
boolean
isURL
(
String
string
)
{
return
isMatch
(
REGEX_URL
,
string
);
}
/**
* @param string 待验证文本
* @return 是否符合汉字
*/
public
static
boolean
isChz
(
String
string
)
{
return
isMatch
(
REGEX_CHZ
,
string
);
}
/**
* @param string 待验证文本
* @return 是否符合用户名
*/
public
static
boolean
isUsername
(
String
string
)
{
return
isMatch
(
REGEX_USERNAME
,
string
);
}
/**
* @param regex 正则表达式字符串
* @param string 要匹配的字符串
* @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;
*/
public
static
boolean
isMatch
(
String
regex
,
String
string
)
{
return
!
TextUtils
.
isEmpty
(
string
)
&&
Pattern
.
matches
(
regex
,
string
);
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/ScreenUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
android.app.Activity
;
import
android.app.KeyguardManager
;
import
android.content.Context
;
import
android.content.pm.ActivityInfo
;
import
android.graphics.Bitmap
;
import
android.os.Build
;
import
android.util.DisplayMetrics
;
import
android.util.TypedValue
;
import
android.view.View
;
import
android.view.Window
;
import
android.view.WindowManager
;
import
android.view.WindowManager.LayoutParams
;
/*********************************************
* author: Blankj on 2016/8/2 12:33
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
ScreenUtils
{
private
ScreenUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* 获取屏幕的宽度px
*/
public
static
int
getScreenWidth
(
Context
context
)
{
WindowManager
windowManager
=
(
WindowManager
)
context
.
getSystemService
(
Context
.
WINDOW_SERVICE
);
DisplayMetrics
outMetrics
=
new
DisplayMetrics
();
// 创建了一张白纸
windowManager
.
getDefaultDisplay
().
getMetrics
(
outMetrics
);
// 给白纸设置宽高
return
outMetrics
.
widthPixels
;
}
/**
* 获取屏幕的高度px
*/
public
static
int
getScreenHeight
(
Context
context
)
{
WindowManager
windowManager
=
(
WindowManager
)
context
.
getSystemService
(
Context
.
WINDOW_SERVICE
);
DisplayMetrics
outMetrics
=
new
DisplayMetrics
();
// 创建了一张白纸
windowManager
.
getDefaultDisplay
().
getMetrics
(
outMetrics
);
// 给白纸设置宽高
return
outMetrics
.
heightPixels
;
}
/**
* 设置透明状态栏(api >= 19方可使用)
* <p>可在Activity的onCreat()中调用
* <p>需在顶部控件布局中加入以下属性让内容出现在状态栏之下
* <p>android:clipToPadding="true"
* <p>android:fitsSystemWindows="true"
*/
public
static
void
setTransparentStatusBar
(
Activity
activity
)
{
if
(
Build
.
VERSION
.
SDK_INT
>=
Build
.
VERSION_CODES
.
KITKAT
)
{
//透明状态栏
activity
.
getWindow
().
addFlags
(
LayoutParams
.
FLAG_TRANSLUCENT_STATUS
);
//透明导航栏
activity
.
getWindow
().
addFlags
(
LayoutParams
.
FLAG_TRANSLUCENT_NAVIGATION
);
}
}
/**
* 隐藏状态栏
* <p>也就是设置全屏,一定要在setContentView之前调用,否则报错
* <p>此方法Activity可以继承AppCompatActivity
* <p>启动的时候状态栏会显示一下再隐藏,比如QQ的欢迎界面
* <p>在配置文件中Activity加属性android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
* <p>如加了以上配置Activity不能继承AppCompatActivity,会报错
*/
public
static
void
hideStatusBar
(
Activity
activity
)
{
activity
.
requestWindowFeature
(
Window
.
FEATURE_NO_TITLE
);
activity
.
getWindow
().
setFlags
(
LayoutParams
.
FLAG_FULLSCREEN
,
LayoutParams
.
FLAG_FULLSCREEN
);
}
/**
* 获取状态栏高度
*/
public
static
int
getStatusBarHeight
(
Context
context
)
{
int
result
=
0
;
int
resourceId
=
context
.
getResources
()
.
getIdentifier
(
"status_bar_height"
,
"dimen"
,
"android"
);
if
(
resourceId
>
0
)
{
result
=
context
.
getResources
().
getDimensionPixelSize
(
resourceId
);
}
return
result
;
}
/**
* 判断状态栏是否存在
*
* @param activity
* @return <ul>
* <li>true: 存在 </li>
* <li>false: 不存在</li>
* </ul>
*/
public
static
boolean
isStatusBarExists
(
Activity
activity
)
{
WindowManager
.
LayoutParams
params
=
activity
.
getWindow
().
getAttributes
();
return
(
params
.
flags
&
LayoutParams
.
FLAG_FULLSCREEN
)
!=
LayoutParams
.
FLAG_FULLSCREEN
;
}
/**
* 获取ActionBar高度
*/
public
static
int
getActionBarHeight
(
Activity
activity
)
{
TypedValue
tv
=
new
TypedValue
();
if
(
activity
.
getTheme
().
resolveAttribute
(
android
.
R
.
attr
.
actionBarSize
,
tv
,
true
))
{
return
TypedValue
.
complexToDimensionPixelSize
(
tv
.
data
,
activity
.
getResources
().
getDisplayMetrics
());
}
return
0
;
}
/**
* 设置屏幕为横屏
* <p>还有一种就是在Activity中加属性android:screenOrientation="landscape"
* <p>不设置Activity的android:configChanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
* <p>设置Activity的android:configChanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
* <p>设置Activity的android:configChanges="orientation|keyboardHidden|screenSize"(4.0以上必须带最后一个参数)时
* 切屏不会重新调用各个生命周期,只会执行onConfigurationChanged方法
*/
public
static
void
setLandscape
(
Activity
activity
)
{
activity
.
setRequestedOrientation
(
ActivityInfo
.
SCREEN_ORIENTATION_LANDSCAPE
);
}
/**
* 获取当前屏幕截图,包含状态栏
*/
public
static
Bitmap
captureWithStatusBar
(
Activity
activity
)
{
View
view
=
activity
.
getWindow
().
getDecorView
();
view
.
setDrawingCacheEnabled
(
true
);
view
.
buildDrawingCache
();
Bitmap
bmp
=
view
.
getDrawingCache
();
int
width
=
getScreenWidth
(
activity
);
int
height
=
getScreenHeight
(
activity
);
Bitmap
bp
=
Bitmap
.
createBitmap
(
bmp
,
0
,
0
,
width
,
height
);
view
.
destroyDrawingCache
();
return
bp
;
}
/**
* 获取当前屏幕截图,不包含状态栏
* <p>需要用到上面获取状态栏高度的方法
*/
public
static
Bitmap
captureWithoutStatusBar
(
Activity
activity
)
{
View
view
=
activity
.
getWindow
().
getDecorView
();
view
.
setDrawingCacheEnabled
(
true
);
view
.
buildDrawingCache
();
Bitmap
bmp
=
view
.
getDrawingCache
();
int
statusBarHeight
=
getStatusBarHeight
(
activity
);
int
width
=
getScreenWidth
(
activity
);
int
height
=
getScreenHeight
(
activity
);
Bitmap
bp
=
Bitmap
.
createBitmap
(
bmp
,
0
,
statusBarHeight
,
width
,
height
-
statusBarHeight
);
view
.
destroyDrawingCache
();
return
bp
;
}
/**
* 判断是否锁屏
*/
public
static
boolean
isScreenLock
(
Context
context
)
{
KeyguardManager
km
=
(
KeyguardManager
)
context
.
getSystemService
(
Context
.
KEYGUARD_SERVICE
);
return
km
.
inKeyguardRestrictedInputMode
();
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/SizeUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
android.content.Context
;
import
android.util.DisplayMetrics
;
import
android.util.Log
;
import
android.util.TypedValue
;
import
android.view.View
;
/*********************************************
* author: Blankj on 2016/8/1 19:12
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
SizeUtils
{
private
SizeUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* dp转px
*/
public
static
int
dp2px
(
Context
context
,
float
dpValue
)
{
final
float
scale
=
context
.
getResources
().
getDisplayMetrics
().
density
;
return
(
int
)
(
dpValue
*
scale
+
0.5f
);
}
/**
* px转dp
*/
public
static
int
px2dp
(
Context
context
,
float
pxValue
)
{
final
float
scale
=
context
.
getResources
().
getDisplayMetrics
().
density
;
return
(
int
)
(
pxValue
/
scale
+
0.5f
);
}
/**
* sp转px
*/
public
static
int
sp2px
(
Context
context
,
float
spValue
)
{
final
float
fontScale
=
context
.
getResources
().
getDisplayMetrics
().
scaledDensity
;
return
(
int
)
(
spValue
*
fontScale
+
0.5f
);
}
/**
* px转sp
*/
public
static
int
px2sp
(
Context
context
,
float
pxValue
)
{
final
float
fontScale
=
context
.
getResources
().
getDisplayMetrics
().
scaledDensity
;
return
(
int
)
(
pxValue
/
fontScale
+
0.5f
);
}
/**
* 各种单位转换
* <p>该方法存在于TypedValue
*/
public
static
float
applyDimension
(
int
unit
,
float
value
,
DisplayMetrics
metrics
)
{
switch
(
unit
)
{
case
TypedValue
.
COMPLEX_UNIT_PX
:
return
value
;
case
TypedValue
.
COMPLEX_UNIT_DIP
:
return
value
*
metrics
.
density
;
case
TypedValue
.
COMPLEX_UNIT_SP
:
return
value
*
metrics
.
scaledDensity
;
case
TypedValue
.
COMPLEX_UNIT_PT
:
return
value
*
metrics
.
xdpi
*
(
1.0f
/
72
);
case
TypedValue
.
COMPLEX_UNIT_IN
:
return
value
*
metrics
.
xdpi
;
case
TypedValue
.
COMPLEX_UNIT_MM
:
return
value
*
metrics
.
xdpi
*
(
1.0f
/
25.4f
);
}
return
0
;
}
/**
* 在onCreate()即可强行获取View的尺寸
* <p>需回调onGetSizeListener接口,在onGetSize中获取view宽高
* 用法示例如下所示
* SizeUtils.forceGetViewSize(view);
* SizeUtils.setListener(new SizeUtils.onGetSizeListener() {
* @Override
* public void onGetSize(View view) {
* Log.d("tag", view.getWidth() + " " + view.getHeight());
* }
* });
*/
public
static
void
forceGetViewSize
(
final
View
view
)
{
view
.
post
(
new
Runnable
()
{
@Override
public
void
run
()
{
if
(
mListener
!=
null
)
{
mListener
.
onGetSize
(
view
);
}
}
});
}
/**
* 获取到View尺寸的监听
*/
public
interface
onGetSizeListener
{
void
onGetSize
(
View
view
);
}
public
static
void
setListener
(
onGetSizeListener
listener
)
{
mListener
=
listener
;
}
private
static
onGetSizeListener
mListener
;
/**
* ListView中提前测量View尺寸,如headerView
* <p>用的时候去掉注释拷贝到ListView中即可
* <p>参照以下注释代码
*/
public
static
void
measureViewInLV
(
View
view
)
{
Log
.
i
(
"tips"
,
"U should copy the following code."
);
/*
ViewGroup.LayoutParams p = view.getLayoutParams();
if (p == null) {
p = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
}
int width = ViewGroup.getChildMeasureSpec(0, 0, p.width);
int height;
int tempHeight = p.height;
if (tempHeight > 0) {
height = MeasureSpec.makeMeasureSpec(tempHeight,
MeasureSpec.EXACTLY);
} else {
height = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
}
view.measure(width, height);
*/
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/TimeUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
java.text.ParseException
;
import
java.text.SimpleDateFormat
;
import
java.util.Date
;
/*********************************************
* author: Blankj on 2016/8/3 20:25
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
TimeUtils
{
private
TimeUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* <p>
* 在工具类中经常使用到工具类的格式化描述,这个主要是一个日期的操作类,所以日志格式主要使用 SimpleDateFormat的定义格式.
* <p>
* 格式的意义如下: 日期和时间模式 <br>
* 日期和时间格式由日期和时间模式字符串指定。在日期和时间模式字符串中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z'
* 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。"''"
* 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在分析时与输入字符串进行匹配。
* <p>
* 定义了以下模式字母(所有其他字符 'A' 到 'Z' 和 'a' 到 'z' 都被保留): <br>
* <table>
* <tr> <td>字母</td> <td>日期或时间元素</td> <td>表示</td> <td>示例</td> <td> </td></tr>
* <tr> <td>G</td> <td>Era</td> <td>标志符</td> <td>Text</td> <td>AD</td> <td> </td></tr>
* <tr> <td>y</td> <td>年</td> <td>Year</td> <td>1996;</td> <td>96</td> <td> </td></tr>
* <tr> <td>M</td> <td>年中的月份</td> <td>Month</td> <td>July;</td> <td>Jul;</td> <td>07 </td></tr>
* <tr> <td>w</td> <td>年中的周数</td> <td>Number</td> <td>27</td> <td> </td></tr>
* <tr> <td>W</td> <td>月份中的周数</td> <td>Number</td> <td>2</td> <td> </td></tr>
* <tr> <td>D</td> <td>年中的天数</td> <td>Number</td> <td>189</td> <td> </td></tr>
* <tr> <td>d</td> <td>月份中的天数</td> <td>Number</td> <td>10</td> <td> </td></tr>
* <tr> <td>F</td> <td>月份中的星期</td> <td>Number</td> <td>2</td> <td> </td></tr>
* <tr> <td>E</td> <td>星期中的天数</td> <td>Text</td> <td>Tuesday;</td> <td>Tue </td></tr>
* <tr> <td>a</td> <td>Am/pm</td> <td>标记</td> <td>Text</td> <td>PM</td> <td> </td></tr>
* <tr> <td>H</td> <td>一天中的小时数(0-23)</td> <td>Number</td> <td>0 </td></tr>
* <tr> <td>k</td> <td>一天中的小时数(1-24)</td> <td>Number</td> <td>24</td> <td> </td></tr>
* <tr> <td>K</td> <td>am/pm</td> <td>中的小时数(0-11)</td> <td>Number</td> <td>0</td> <td> </td></tr>
* <tr> <td>h</td> <td>am/pm</td> <td>中的小时数(1-12)</td> <td>Number</td> <td>12</td> <td> </td></tr>
* <tr> <td>m</td> <td>小时中的分钟数</td> <td>Number</td> <td>30</td> <td> </td></tr>
* <tr> <td>s</td> <td>分钟中的秒数</td> <td>Number</td> <td>55</td> <td> </td></tr>
* <tr> <td>S</td> <td>毫秒数</td> <td>Number</td> <td>978</td> <td> </td></tr>
* <tr> <td>z</td> <td>时区</td> <td>General</td> <td>time</td> <td>zone</td> <td>Pacific</td> <td>Standard</td> <td>Time;</td> <td>PST;</td> <td>GMT-08:00 </td></tr>
* <tr> <td>Z</td> <td>时区</td> <td>RFC</td> <td>822</td> <td>time</td> <td>zone</td> <td>-0800</td> <td> </td></tr>
* </table>
* <p>
* <p>
* <pre>
* yyyy-MM-dd 1969-12-31
* yyyy-MM-dd 1970-01-01
* yyyy-MM-dd HH:mm 1969-12-31 16:00
* yyyy-MM-dd HH:mm 1970-01-01 00:00
* yyyy-MM-dd HH:mmZ 1969-12-31 16:00-0800
* yyyy-MM-dd HH:mmZ 1970-01-01 00:00+0000
* yyyy-MM-dd HH:mm:ss.SSSZ 1969-12-31 16:00:00.000-0800
* yyyy-MM-dd HH:mm:ss.SSSZ 1970-01-01 00:00:00.000+0000
* yyyy-MM-dd'T'HH:mm:ss.SSSZ 1969-12-31T16:00:00.000-0800
* yyyy-MM-dd'T'HH:mm:ss.SSSZ 1970-01-01T00:00:00.000+0000
* </pre>
*/
public
static
final
SimpleDateFormat
DEFAULT_SDF
=
new
SimpleDateFormat
(
"yyyy-MM-dd HH:mm:ss"
);
/**
* 各时间单位与毫秒的倍数
*/
public
static
final
int
UNIT_MSEC
=
1
;
public
static
final
int
UNIT_SEC
=
1000
;
public
static
final
int
UNIT_MIN
=
60000
;
public
static
final
int
UNIT_HOUR
=
3600000
;
public
static
final
int
UNIT_DAY
=
86400000
;
/**
* 将时间戳转为时间字符串
* <p>格式为yyyy-MM-dd HH:mm:ss
*/
public
static
String
milliseconds2String
(
long
milliseconds
)
{
return
milliseconds2String
(
milliseconds
,
DEFAULT_SDF
);
}
/**
* 将时间戳转为时间字符串
* <p>格式为用户自定义
*/
public
static
String
milliseconds2String
(
long
milliseconds
,
SimpleDateFormat
format
)
{
return
format
.
format
(
new
Date
(
milliseconds
));
}
/**
* 将时间字符串转为时间戳
* <p>格式为yyyy-MM-dd HH:mm:ss
*/
public
static
long
string2Milliseconds
(
String
time
)
{
return
string2Milliseconds
(
time
,
DEFAULT_SDF
);
}
/**
* 将时间字符串转为时间戳
* <p>格式为用户自定义
*/
public
static
long
string2Milliseconds
(
String
time
,
SimpleDateFormat
format
)
{
try
{
return
format
.
parse
(
time
).
getTime
();
}
catch
(
ParseException
e
)
{
e
.
printStackTrace
();
}
return
-
1
;
}
/**
* 将时间字符串转为Date类型
* <p>格式为yyyy-MM-dd HH:mm:ss
*/
public
static
Date
string2Date
(
String
formatDate
)
{
return
string2Date
(
formatDate
,
DEFAULT_SDF
);
}
/**
* 将时间字符串转为Date类型
* <p>格式为用户自定义
*/
public
static
Date
string2Date
(
String
formatDate
,
SimpleDateFormat
format
)
{
return
new
Date
(
string2Milliseconds
(
formatDate
,
format
));
}
/**
* 将Date类型转为时间字符串
* <p>格式为yyyy-MM-dd HH:mm:ss
*/
public
static
String
date2String
(
Date
date
)
{
return
date2String
(
date
,
DEFAULT_SDF
);
}
/**
* 将Date类型转为时间字符串
* <p>格式为用户自定义
*/
public
static
String
date2String
(
Date
date
,
SimpleDateFormat
format
)
{
return
format
.
format
(
date
);
}
/**
* 将Date类型转为时间戳
*/
public
static
long
date2Milliseconds
(
Date
date
)
{
return
date
.
getTime
();
}
/**
* 将时间戳转为Date类型
*/
public
static
Date
milliseconds2Date
(
long
milliseconds
)
{
return
new
Date
(
milliseconds
);
}
/**
* 毫秒时间戳单位转换(单位:unit)
* <pre>
* UNIT_MSEC:毫秒
* UNIT_SEC :秒
* UNIT_MIN :分
* UNIT_HOUR:小时
* UNIT_DAY :天
* </pre>
*/
private
static
long
milliseconds2Unit
(
long
milliseconds
,
int
unit
)
{
switch
(
unit
)
{
case
UNIT_MSEC:
case
UNIT_SEC:
case
UNIT_MIN:
case
UNIT_HOUR:
case
UNIT_DAY:
return
Math
.
abs
(
milliseconds
)
/
unit
;
}
return
-
1
;
}
/**
* 获取两个时间差(单位:unit)
* <pre>
* UNIT_MSEC:毫秒
* UNIT_SEC :秒
* UNIT_MIN :分
* UNIT_HOUR:小时
* UNIT_DAY :天
* </pre>
* <p>time1和time2格式都为yyyy-MM-dd HH:mm:ss
*/
public
static
long
getIntervalTime
(
String
time1
,
String
time2
,
int
unit
)
{
return
getIntervalTime
(
time1
,
time2
,
unit
,
DEFAULT_SDF
);
}
/**
* 获取两个时间差(单位:unit)
* <pre>
* UNIT_MSEC:毫秒
* UNIT_SEC :秒
* UNIT_MIN :分
* UNIT_HOUR:小时
* UNIT_DAY :天
* </pre>
* <p>time1和time2格式都为format
*/
public
static
long
getIntervalTime
(
String
time1
,
String
time2
,
int
unit
,
SimpleDateFormat
format
)
{
return
milliseconds2Unit
(
string2Milliseconds
(
time1
,
format
)
-
string2Milliseconds
(
time2
,
format
),
unit
);
}
/**
* 获取两个时间差(单位:unit)
* <pre>
* UNIT_MSEC:毫秒
* UNIT_SEC :秒
* UNIT_MIN :分
* UNIT_HOUR:小时
* UNIT_DAY :天
* </pre>
* <p>time1和time2都为Date
*/
public
static
long
getIntervalTime
(
Date
time1
,
Date
time2
,
int
unit
)
{
return
milliseconds2Unit
(
date2Milliseconds
(
time2
)
-
date2Milliseconds
(
time1
),
unit
);
}
/**
* 获取当前时间
* <p>单位(毫秒)
*/
public
static
long
getCurTimeMills
()
{
return
System
.
currentTimeMillis
();
}
/**
* 获取当前时间
* <p>格式为yyyy-MM-dd HH:mm:ss
*/
public
static
String
getCurTimeString
()
{
return
milliseconds2String
(
getCurTimeMills
());
}
/**
* 获取当前时间
* <p>格式为用户自定义
*/
public
static
String
getCurTimeString
(
SimpleDateFormat
format
)
{
return
milliseconds2String
(
getCurTimeMills
(),
format
);
}
/**
* 获取当前时间
* <p>Date类型
*/
public
static
Date
getCurTimeDate
()
{
return
new
Date
();
}
/**
* 获取与当前时间的差(单位:unit)
* <pre>
* UNIT_MSEC:毫秒
* UNIT_SEC :秒
* UNIT_MIN :分
* UNIT_HOUR:小时
* UNIT_DAY :天
* <p>time1和time2格式都为yyyy-MM-dd HH:mm:ss
*/
public
static
long
getIntervalByNow
(
String
time
,
int
unit
)
{
return
getIntervalByNow
(
time
,
unit
,
DEFAULT_SDF
);
}
/**
* 获取与当前时间的差(单位:unit)
* <pre>
* UNIT_MSEC:毫秒
* UNIT_SEC :秒
* UNIT_MIN :分
* UNIT_HOUR:小时
* UNIT_DAY :天
* <p>time1和time2格式都为format
*/
public
static
long
getIntervalByNow
(
String
time
,
int
unit
,
SimpleDateFormat
format
)
{
return
getIntervalTime
(
getCurTimeString
(),
time
,
unit
,
format
);
}
/**
* 获取与当前时间的差(单位:unit)
* <pre>
* UNIT_MSEC:毫秒
* UNIT_SEC :秒
* UNIT_MIN :分
* UNIT_HOUR:小时
* UNIT_DAY :天
* <p>time1和time2格式都为format
*/
public
static
long
getIntervalByNow
(
Date
time
,
int
unit
)
{
return
getIntervalTime
(
getCurTimeDate
(),
time
,
unit
);
}
/**
* 判断闰年
*/
public
static
boolean
isLeapYear
(
int
year
)
{
return
year
%
4
==
0
&&
year
%
100
!=
0
||
year
%
400
==
0
;
}
}
androidframework/src/main/java/com/blankj/androidframework/utils/UnclassifiedUtils.java
已删除
100644 → 0
浏览文件 @
acf24c36
package
com.blankj.androidframework.utils
;
import
android.app.ActivityManager
;
import
android.app.ActivityManager.RunningServiceInfo
;
import
android.content.ComponentName
;
import
android.content.Context
;
import
java.util.List
;
/*********************************************
* author: Blankj on 2016/8/2 21:24
* blog: http://blankj.com
* e-mail: blankj@qq.com
*********************************************/
public
class
UnclassifiedUtils
{
private
UnclassifiedUtils
()
{
throw
new
UnsupportedOperationException
(
"u can't fuck me..."
);
}
/**
* 获取服务是否开启
* @param className 完整包名的服务类名
*/
public
static
boolean
isRunningService
(
String
className
,
Context
context
)
{
// 进程的管理者,活动的管理者
ActivityManager
activityManager
=
(
ActivityManager
)
context
.
getSystemService
(
Context
.
ACTIVITY_SERVICE
);
// 获取正在运行的服务,最多获取1000个
List
<
RunningServiceInfo
>
runningServices
=
activityManager
.
getRunningServices
(
1000
);
// 遍历集合
for
(
RunningServiceInfo
runningServiceInfo
:
runningServices
)
{
ComponentName
service
=
runningServiceInfo
.
service
;
if
(
className
.
equals
(
service
.
getClassName
()))
{
return
true
;
}
}
return
false
;
}
}
androidframework/src/main/res/values/strings.xml
已删除
100644 → 0
浏览文件 @
acf24c36
<resources>
<string
name=
"app_name"
>
Android Framework
</string>
</resources>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录