前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >「PhoneInfo」开发记录

「PhoneInfo」开发记录

作者头像
AnRFDev
发布2021-02-01 15:17:26
5030
发布2021-02-01 15:17:26
举报
文章被收录于专栏:AnRFDevAnRFDev

开发过程中,一些低频使用的API不太记得,每次都要查一下。比如Build这个类。 做一个app,一边显示代码,一边显示结果,岂不美哉。

发布地址

页面布局

ViewPager + TabLayout

承载多个fragment,显示不同的信息。

TabLayout字体大小改小一点。

style.xml里增加

代码语言:javascript
复制
<style name="DashPageTabText" parent="TextAppearance.AppCompat.Button">
    <item name="android:textSize">10sp</item>
</style>

<style name="DashPageTabLayout" parent="Widget.Design.TabLayout">
    <item name="tabTextAppearance">@style/DashPageTabText</item>
    <!--<item name="tabSelectedTextColor">SELECTED TAB TEXT COLOR</item>-->
    <!--<item name="tabIndicatorColor">SELECTED TAB INDICATOR COLOR</item>-->
</style>

tabLayout中增加style

代码语言:javascript
复制
<com.google.android.material.tabs.TabLayout
    android:id="@+id/dash_page_tabs"
    style="@style/DashPageTabLayout"
    android:layout_width="match_parent"
    android:layout_height="40dp" />

参考 https://stackoverflow.com/questions/31471177/text-size-of-android-design-tablayout-tabs

或者设置选中和未选中tab时文字的颜色,设置tab可以滚动

代码语言:javascript
复制
<com.google.android.material.tabs.TabLayout
    android:id="@+id/dash_page_tabs"
    style="@style/DashPageTabLayout"
    android:layout_width="wrap_content"
    android:layout_height="40dp"
    app:tabMode="scrollable"
    app:tabSelectedTextColor="#000"
    app:tabTextColor="#99222222" />

TabLayout ViewPager 联动

DashPagerAdapter类。

代码语言:javascript
复制
import android.view.View;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

public class DashPagerAdapter extends FragmentPagerAdapter {
    private int fragCount;
    // 装着fragment

    public DashPagerAdapter(FragmentManager fm, int count) {
        super(fm);
        fragCount = count;
    }

    @Override
    public int getCount() {
        return fragCount;
    }

    @Override
    public Fragment getItem(int position) {
        return // 返回对应的fragment;
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return super.isViewFromObject(view, object);
    }

}

onCreate里初始化

代码语言:javascript
复制
mTabLayout = findViewById(R.id.dash_page_tabs);
mViewPager = findViewById(R.id.dash_page_vp);
mTabLayout.addTab(mTabLayout.newTab().setText("Build"));
mTabLayout.addTab(mTabLayout.newTab().setText("Screen"));
mTabLayout.addTab(mTabLayout.newTab().setText("WiFi"));
mTabLayout.addTab(mTabLayout.newTab().setText("ext-Storage"));
mTabLayout.addTab(mTabLayout.newTab().setText("app-Storage"));
mTabLayout.addTab(mTabLayout.newTab().setText("uri"));
mTabLayout.addTab(mTabLayout.newTab().setText("battery"));

mDashPagerAdapter = new DashPagerAdapter(getSupportFragmentManager(), mTabLayout.getTabCount());

mViewPager.setAdapter(mDashPagerAdapter);
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
    @Override
    public void onTabSelected(TabLayout.Tab tab) {
        final int pos = tab.getPosition();
        mViewPager.setCurrentItem(pos);
    }

    @Override
    public void onTabUnselected(TabLayout.Tab tab) {

    }

    @Override
    public void onTabReselected(TabLayout.Tab tab) {

    }
});

Build类

比如这样

展示Build类的API
展示Build类的API
代码语言:javascript
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O &&
        PackageManager.PERMISSION_GRANTED == ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE)) {
    mInfoReAdapter.addOrUpdate(K_SERIAL, "Build.getSerial()", Build.getSerial());
} else {
    mInfoReAdapter.addOrUpdate(Build.SERIAL, "Build.SERIAL", Build.SERIAL);
}
mInfoReAdapter.addOrUpdate("Build.getRadioVersion()", "Build.getRadioVersion()", Build.getRadioVersion());
mInfoReAdapter.addOrUpdate("Build.ID               ", "Build.ID", Build.ID);
// ....
mInfoReAdapter.addOrUpdate("Build.USER             ", "Build.USER", Build.USER);
mInfoReAdapter.notifyDataSetChanged();

屏幕信息

获取屏幕宽高。获取屏幕宽高的方法大约有3种,这里直接用view.post(runnable)的方式来获取实际宽高。

代码语言:javascript
复制
final View root = findViewById(R.id.container);
root.post(new Runnable() {
    @Override
    public void run() {
        final int wid = root.getWidth();
        final int height = root.getHeight();
        Log.d(TAG, "phone screen size [" + wid + ", " + height + "]");
        mDashPagerAdapter.setPhoneScreenSize(wid, height);
    }
});

把像素转换成dp

代码语言:javascript
复制
float pxToDp(int px) {
    return (px / Resources.getSystem().getDisplayMetrics().density);
}

存储路径信息

比如获取到外部存储的路径等等。

代码语言:javascript
复制
mInfoReAdapter.addOrUpdateUpDown("root", "Environment.getRootDirectory().getAbsolutePath()",
        Environment.getRootDirectory().getAbsolutePath());

Uri类信息

展示Uri类的一些信息。

代码语言:javascript
复制
Uri uri = Uri.fromFile(getActivity().getApplicationContext().getFilesDir());

crash java.lang.ClassNotFoundException

Google play console 收集到的crash信息。崩溃机型是华为和三星。

Galaxy A40 (a40), Note9 (crownlte), A70 (a70q), Note8 (greatlte);Mate 10 Pro (HWBLA)

代码语言:javascript
复制
java.lang.RuntimeException: 
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3586)
  at android.app.ActivityThread.access$1300 (ActivityThread.java:240)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1808)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:214)
  at android.app.ActivityThread.main (ActivityThread.java:7094)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:494)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:975)
Caused by: java.lang.ClassNotFoundException: 
  at dalvik.system.BaseDexClassLoader.findClass (BaseDexClassLoader.java:134)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:379)
  at java.lang.ClassLoader.loadClass (ClassLoader.java:312)
  at android.app.AppComponentFactory.instantiateReceiver (AppComponentFactory.java:84)
  at androidx.core.app.CoreComponentFactory.instantiateReceiver (CoreComponentFactory.java:56)
  at android.app.ActivityThread.handleReceiver (ActivityThread.java:3579)

根据ActivityThread.handleReceiver猜测,有一个广播接收器示例化失败了。 应用里只有一个动态注册的广播接收器。应该是注册失败了。手头上没有三星和华为。暂时没法重现。

更新记录

  • [1.1.4] 2020-1-7
    • 使用新的UI样式
  • [1.1.1] 2019-11-10
    • 修改电池广播接收器的信息类型
  • [1.0.9] 2019-9-14
    • 修改ui
  • [1.0.8] 2019-9-13
    • 增加了Uri类的信息
  • [1.0.6] 2019-9-4
    • 增加了Environment类的信息
    • 修复了定位权限对Wi-Fi信息界面的影响
  • 2019-8-17
    • 增加了屏幕尺寸信息
    • 采用ViewPager + TabLayout显示多个页面
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 页面布局
    • TabLayout ViewPager 联动
    • Build类
    • 屏幕信息
    • 存储路径信息
    • Uri类信息
    • crash java.lang.ClassNotFoundException
    • 更新记录
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档