easyandroidgroup / easyandroid Goto Github PK
View Code? Open in Web Editor NEW一系列简单、轻量、方便的Android开发工具集合(持续更新中),包括Android动态权限、SharedPreferences、反射、日志、Toast、Bundle、MVP、线程池、Html、图文混排、蒙层引导、拍照、图库选择等
License: Apache License 2.0
一系列简单、轻量、方便的Android开发工具集合(持续更新中),包括Android动态权限、SharedPreferences、反射、日志、Toast、Bundle、MVP、线程池、Html、图文混排、蒙层引导、拍照、图库选择等
License: Apache License 2.0
首先感谢作者开源,我觉得很多代码思路有参考价值,
但是我目前还是在用java写代码,没系统学过kt,看代码有点费劲,能否开个java版的
建议拆包,不同功能可以只集成其中一部分。有的功能不想要集成,项目中已经有了替代品, 但是有的功能项目中想要。
这样用这个库的人就更多了。
支持选择视频么
I think that is more comfortable to Add Permission Controller which may be named as EasyPermission.
2020-05-22 18:04:25.420 29059-29059/com.haoge.sample.easyandroid E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.haoge.sample.easyandroid, PID: 29059
java.util.MissingFormatArgumentException: Format specifier '%s'
at java.util.Formatter.format(Formatter.java:2523)
at java.util.Formatter.format(Formatter.java:2459)
at java.lang.String.format(String.java:2870)
at com.haoge.easyandroid.easy.EasyFormatter.formatWithArgs(EasyFormatter.kt:45)
at com.haoge.easyandroid.easy.EasyLog.format(EasyLog.kt:159)
at com.haoge.easyandroid.easy.EasyLog.access$format(EasyLog.kt:29)
at com.haoge.easyandroid.easy.EasyLog$e$1.invoke(EasyLog.kt:125)
at com.haoge.easyandroid.easy.EasyLog$e$1.invoke(EasyLog.kt:29)
at com.haoge.easyandroid.easy.EasyLog.dispatchToLogPrinterThread(EasyLog.kt:149)
at com.haoge.easyandroid.easy.EasyLog.e(EasyLog.kt:125)
at com.haoge.easyandroid.easy.EasyLog.e(EasyLog.kt:115)
at com.haoge.sample.easyandroid.activities.EasySharedPreferencesActivity.createByEasy(EasySharedPreferencesActivity.kt:37)
at com.haoge.sample.easyandroid.activities.EasySharedPreferencesActivity_ViewBinding$2.doClick(EasySharedPreferencesActivity_ViewBinding.java:43)
at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
at android.view.View.performClick(View.java:7161)
at android.view.View.performClickInternal(View.java:7138)
at android.view.View.access$3500(View.java:811)
at android.view.View$PerformClick.run(View.java:27419)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7520)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
引导层能不能加个显示次数的设置?
2020-05-22 18:01:50.243 28381-28797/com.haoge.sample.easyandroid E/AndroidRuntime: FATAL EXCEPTION: EasyLog Printer Thread
Process: com.haoge.sample.easyandroid, PID: 28381
java.util.MissingFormatArgumentException: Format specifier '%s'
at java.util.Formatter.format(Formatter.java:2523)
at java.util.Formatter.format(Formatter.java:2459)
at java.lang.String.format(String.java:2870)
at com.haoge.easyandroid.easy.EasyFormatter.formatWithArgs(EasyFormatter.kt:45)
at com.haoge.easyandroid.easy.EasyLog.format(EasyLog.kt:159)
at com.haoge.easyandroid.easy.EasyLog.access$format(EasyLog.kt:29)
at com.haoge.easyandroid.easy.EasyLog$e$1.invoke(EasyLog.kt:125)
at com.haoge.easyandroid.easy.EasyLog$e$1.invoke(EasyLog.kt:29)
at com.haoge.easyandroid.easy.EasyLog$dispatchToLogPrinterThread$1.run(EasyLog.kt:152)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
at java.lang.Thread.run(Thread.java:919)
private fun getActivity(dialog: Dialog): Activity? {
var bindAct: Activity? = null
var context = dialog.context
do {
if (context is Activity) {
bindAct = context
break
} else if (context is ContextThemeWrapper) {
context = context.baseContext
} else {
break
}
} while (true)
return bindAct
}
这里为什么要用一个while 循环呢
2020-05-22 18:08:00.004 1613-3786/? E/TaskPersister: File error accessing recents directory (directory doesn't exist?).
2020-05-22 18:08:00.821 6712-6860/? E/DatabaseUtils: Writing exception to parcel
java.lang.IllegalArgumentException: MIME type image/jpeg cannot be inserted into content://media/external/audio/media; expected MIME type under audio/*
at com.android.providers.media.MediaProvider.ensureFileColumns(MediaProvider.java:2141)
at com.android.providers.media.MediaProvider.ensureUniqueFileColumns(MediaProvider.java:2008)
at com.android.providers.media.MediaProvider.insertFile(MediaProvider.java:2576)
at com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:3175)
at com.android.providers.media.MediaProvider.insert(MediaProvider.java:2988)
at android.content.ContentProvider$Transport.insert(ContentProvider.java:309)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:154)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
2020-05-22 18:08:00.826 1328-1328/com.haoge.sample.easyandroid E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.haoge.sample.easyandroid, PID: 1328
java.lang.IllegalArgumentException: MIME type image/jpeg cannot be inserted into content://media/external/audio/media; expected MIME type under audio/*
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:170)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.insert(ContentProviderNative.java:481)
at android.content.ContentResolver.insert(ContentResolver.java:1844)
at com.haoge.easyandroid.easy.EasyMedia.getAudio(EasyMedia.kt:372)
at com.haoge.sample.easyandroid.activities.EasyPhotoActivity.getAudio(EasyPhotoActivity.kt:98)
at com.haoge.sample.easyandroid.activities.EasyPhotoActivity_ViewBinding$9.doClick(EasyPhotoActivity_ViewBinding.java:120)
at butterknife.internal.DebouncingOnClickListener.onClick(DebouncingOnClickListener.java:22)
at android.view.View.performClick(View.java:7161)
at android.view.View.performClickInternal(View.java:7138)
at android.view.View.access$3500(View.java:811)
at android.view.View$PerformClick.run(View.java:27419)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7520)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:539)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)
MIUI 版本:11.20.1.21开发版
Android 版本: 10
val photo = EasyPhoto()
.setCrop(true)
photo.setCallback {
val requestBody = it.asRequestBody()
val multipartBody = MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("avatar", it.name, requestBody)
.build()
mPresenter?.avatar(multipartBody.parts[0])
}
photo.setError {
EasyLog.DEFAULT.e(it)
EasyToast.DEFAULT.show(it.message)
}
photo.selectPhoto(getHostActivity())
ImageGetterLoader不能播放gif图片
SharedPreferences 源码中读取xml后所有操作都要在map操作,然后再次全覆盖写入xml,如果和常用的 bo 数据对象结合并不好,一般建议就是存类似开关的简易数据,复杂数据推荐用数据库,
内存泄漏信息:
┬───
│ GC Root: Thread object
│
├─ java.lang.Thread instance
│ Leaking: UNKNOWN
│ Retaining 1.5 MB in 5990 objects
│ Thread name: 'EasyExecutor'
│ ↓ Thread.uncaughtExceptionHandler
│ ~~~~~~~~~~~~~~~~~~~~~~~~
├─ com.haoge.easyandroid.easy.EasyExecutor$TaskWrapper$run$1 instance
│ Leaking: UNKNOWN
│ Retaining 1.5 MB in 5975 objects
│ Anonymous class implementing java.lang.Thread$UncaughtExceptionHandler
│ ↓ EasyExecutor$TaskWrapper$run$1.this$0
│ ~~~~~~
├─ com.haoge.easyandroid.easy.EasyExecutor$TaskWrapper instance
│ Leaking: UNKNOWN
│ Retaining 1.5 MB in 5974 objects
│ ↓ EasyExecutor$TaskWrapper.result
│ ~~~~~~
├─ io.agora.chatdemo.av.DemoCallKitListener$2 instance
│ Leaking: UNKNOWN
│ Retaining 1.5 MB in 5970 objects
│ Anonymous class implementing kotlin.jvm.functions.Function1
│ ↓ DemoCallKitListener$2.val$callback
│ ~~~~~~~~~~~~
├─ io.agora.chat.callkit.ui.EaseCallSingleBaseActivity$3 instance
│ Leaking: UNKNOWN
│ Retaining 1.5 MB in 5969 objects
│ Anonymous class implementing io.agora.chat.callkit.listener.EaseCallKitTokenCallback
│ this$0 instance of io.agora.chatdemo.av.CallSingleBaseActivity with mDestroyed = true
│ ↓ EaseCallSingleBaseActivity$3.this$0
│ ~~~~~~
╰→ io.agora.chatdemo.av.CallSingleBaseActivity instance
Leaking: YES (ObjectWatcher was watching this because io.agora.chatdemo.av.CallSingleBaseActivity received
Activity#onDestroy() callback and Activity#mDestroyed is true)
Retaining 1.5 MB in 5968 objects
key = 3c87f3d8-f77b-470e-ac32-9f733bb87aff
watchDurationMillis = 10939
retainedDurationMillis = 5938
mApplication instance of io.agora.chatdemo.DemoApplication
mBase instance of androidx.appcompat.view.ContextThemeWrapper
代码中使用如下:
public class DemoCallKitListener implements EaseCallKitListener {
...
private final EasyExecutor executor;
...
public DemoCallKitListener(Context context, UsersManager usersManager) {
this.mContext = context;
this.mUsersManager = usersManager;
executor = EasyExecutor.newBuilder(0)
.build();
}
@Override
public void onGenerateRTCToken(String userAccount, String channelName, EaseCallKitTokenCallback callback) {
StringBuilder url = buildUrl(userAccount, channelName);
getRtcToken(url.toString(), agoraUid, callback);
}
private void getRtcToken(String tokenUrl, int agoraUid, EaseCallKitTokenCallback callback) {
executor.asyncResult(new Function1<Pair<Integer, String>, Unit>() {
@Override
public Unit invoke(Pair<Integer, String> response) {
...
JSONObject object = new JSONObject(responseInfo);
String token = object.getString("accessToken");
//Set your avatar nickname
setEaseCallKitUserInfo(ChatClient.getInstance().getCurrentUser());
callback.onSetToken(token, agoraUid);
...
return null;
}
})
.asyncTask(notifier -> {
try {
Pair<Integer, String> response = EMHttpClient.getInstance().sendRequestWithToken(tokenUrl, null, EMHttpClient.GET);
return response;
} catch (ChatException exception) {
exception.printStackTrace();
}
return null;
});
}
EasyImageGetter.create()
.setPlaceHolder(R.drawable.placeholder)// 设置在进行图片加载时的占位图
.setError(R.drawable.error)// 设置在进行图片加载失败时的占位图
.loadHtml(html, textView);
这样设置,create方法爆红,没有找到
目前测了华为荣耀和华为mate10系列手机,申请权限会弹两种框;小米系列没问题;怎么解决啊大神??
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.