Giter Club home page Giter Club logo

easyandroidgroup / easyandroid Goto Github PK

View Code? Open in Web Editor NEW
1.2K 25.0 197.0 679 KB

一系列简单、轻量、方便的Android开发工具集合(持续更新中),包括Android动态权限、SharedPreferences、反射、日志、Toast、Bundle、MVP、线程池、Html、图文混排、蒙层引导、拍照、图库选择等

License: Apache License 2.0

Kotlin 100.00%
android permissions sharedpreferences reflection log toast mvp bundle photos executor

easyandroid's People

Contributors

vicent9920 avatar yjfnypeu avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

easyandroid's Issues

EasyImageGetter问题

我在项目中复制了EasyImageGetter的使用,但是发现在release环境下无法正常加载中的图片,一直显示是我设置的placeHolder图片,请问一下是什么问题?

能否开个java版的?

首先感谢作者开源,我觉得很多代码思路有参考价值,
但是我目前还是在用java写代码,没系统学过kt,看代码有点费劲,能否开个java版的

可以分包吗

建议拆包,不同功能可以只集成其中一部分。有的功能不想要集成,项目中已经有了替代品, 但是有的功能项目中想要。

这样用这个库的人就更多了。

EasyPermission

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)

SafeDialogHandle

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)

EasyPhoto提示:保存时发生错误,保存失败

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())

SharedPreferences 的建议

SharedPreferences 源码中读取xml后所有操作都要在map操作,然后再次全覆盖写入xml,如果和常用的 bo 数据对象结合并不好,一般建议就是存类似开关的简易数据,复杂数据推荐用数据库,

EaseExecutor存在内存泄漏

内存泄漏信息:
┬───
│ 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;
            });
}

java不能调用imagegetter

EasyImageGetter.create()
.setPlaceHolder(R.drawable.placeholder)// 设置在进行图片加载时的占位图
.setError(R.drawable.error)// 设置在进行图片加载失败时的占位图
.loadHtml(html, textView);
这样设置,create方法爆红,没有找到

华为手机弹两次框

目前测了华为荣耀和华为mate10系列手机,申请权限会弹两种框;小米系列没问题;怎么解决啊大神??

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.