Android 问题整理 二

// android 6.0+ 以上动态权限申请 api level 23+

——BaseActivity.java 中执行——

    /**
     * android 6.0 以上需要动态申请权限
     */
    private void initPermission() {
        String permissions[] = {Manifest.permission.RECORD_AUDIO,
                Manifest.permission.ACCESS_NETWORK_STATE,
                Manifest.permission.INTERNET,
                Manifest.permission.READ_PHONE_STATE,
                Manifest.permission.WRITE_EXTERNAL_STORAGE
        };

        ArrayList<String> toApplyList = new ArrayList<String>();

        for (String perm :permissions){
            if (PackageManager.PERMISSION_GRANTED != ContextCompat.checkSelfPermission(context, perm)) {
                toApplyList.add(perm);
                //进入到这里代表没有权限.
            }
        }
        String tmpList[] = new String[toApplyList.size()];
        if (!toApplyList.isEmpty()){
            ActivityCompat.requestPermissions((Activity) context, toApplyList.toArray(tmpList), PERMISSON_REQUESTCODE);
        }
    }

——–其他———-

if (Build.VERSION.SDK_INT >= 23) {
    int REQUEST_CODE_CONTACT = 101;
    String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE};

    // 验证是否许可权限
    for (String str : permissions) {
        if (checkSelfPermission(str) != PackageManager.PERMISSION_GRANTED) {
            // 申请权限
            requestPermissions(permissions, REQUEST_CODE_CONTACT);
        }
    }
}

// 包名冲突 参考文章

Failure [INSTALL_FAILED_CONFLICTING_PROVIDER:
Package couldn’t be installed in /data/app/com.china.swp-1:
Can’t install because provider name com.wq.photo.fileprovider (in package com.china.swp) is already used by com.china.pmc]

将项目中自己用到的地方所有的 com.wq 修改一个名称 (Ctrl Shift F 注意快捷键会被搜狗输入法或其他程序占用)

android:authorities="com.swp_wq.fileprovider" // AndroidManifest.xml
Uri uri = FileProvider.getUriForFile(getApplicationContext(), "com.swp_wq.photo.fileprovider", currentfile); // Uri

// Cannot access android.arch.lifecycle.LifecycleOwner 参考文章

pmc_qinmei 

public class BsbEaseChatFragment extends EaseBaseFragment implements EMMessageListener

在项目的 Moudle:app 的 dependencies 中添加如下代码,sync now 

    implementation "android.arch.lifecycle:livedata:1.1.1"
    implementation "android.arch.lifecycle:viewmodel:1.1.1"
    implementation "android.arch.lifecycle:extensions:1.1.1"

// 支付宝 生成秘钥工具 secret_key_tools_RSA256_win 打不开

该文件不能放在有中文目录、空格的目录当中执行。


// 微信分享无法使用

微信分享官网提示,需要按照发布流程使用自定义keystore,使用打包后的apk进行安装,这时测试分享(代码没有问题)即可正常

// 微信登陆报错baseResp.errCode=-6 参考文章

1.baseResp.errCode=-6 就代表签名和打包的秘钥生成的签名不一致,会导致调起来的微信授权登录页一片空白,我用cocos的应用包名去生成md5签名和用keystore生成的签名不一致,不知道什么原因,导致我遇到了这样的问题,去微信开发平台改成
用keystore生成的签名就好了,

但问题来了,发现修改了签名还是一样没效果,我就很纳闷了,网上有人说是修改了开放平台的签名,要过一天才生效,但我发现有人说立马就生效了,但需要卸载微信重新安装,这是因为客户端会缓存之前的签名。然后就抱着试一试的心态,果然成功了。
微信开放平台的开发文档文档不详细,竟然没有-6的说明,坑坑


// mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi 对应的像素密度;参考文章  参考文章2


// android studio 安装APP提示关于 slice_3.apk 类似问题


// android recyclerview 的引入

在项目中引入
implementation 'com.android.support:appcompat-v7:26.1.0' // 这里的代码是原有的
implementation 'com.android.support:recyclerview-v7:26.1.0' // 引入这行代码就可以了,这里的版本号要和上面的一致,否则会报错
解决 ScrollView 嵌套 recyclerview ,item 不显示
view = LayoutInflater.from(parent.getContext())
          .inflate(R.layout.item_shop_detail, parent, false);

// recyclerView 上拉加载更多 参考文章https://www.jianshu.com/p/66d817325e94

滑动监听,判断是否滑动到了最后一个条目

recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {  
    //用来标记是否正在向最后一个滑动  
    boolean isSlidingToLast = false;  

    @Override  
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {  
        super.onScrollStateChanged(recyclerView, newState);
        //设置什么布局管理器,就获取什么的布局管理器
        LinearLayoutManager manager = (LinearLayoutManager) recyclerView.getLayoutManager();  
        // 当停止滑动时  
        if (newState == RecyclerView.SCROLL_STATE_IDLE) {  
            //获取最后一个完全显示的ItemPosition ,角标值 
            int lastVisibleItem = manager.findLastCompletelyVisibleItemPosition();  
            //所有条目,数量值
            int totalItemCount = manager.getItemCount();  

            // 判断是否滚动到底部,并且是向右滚动  
            if (lastVisibleItem == (totalItemCount - 1) && isSlidingToLast) {  
                //加载更多功能的代码  
                
            }  
        }  
    }  

    @Override  
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {  
        super.onScrolled(recyclerView, dx, dy);  
        //dx用来判断横向滑动方向,dy用来判断纵向滑动方向  
        //dx>0:向右滑动,dx<0:向左滑动
        //dy>0:向下滑动,dy<0:向上滑动
        if (dy > 0) {  
            isSlidingToLast = true;  
        } else {  
            isSlidingToLast = false;  
        }  
    }  
});

作者:我爱吃青苹果
链接:https://www.jianshu.com/p/66d817325e94
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

或者用下列方法

public abstract class OnLoadMoreListener extends RecyclerView.OnScrollListener {
    private LinearLayoutManager layoutManager;
    private int itemCount, lastPosition, lastItemCount;
    public abstract void onLoadMore();
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
            layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
            itemCount = layoutManager.getItemCount();
            lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
        } else {
            Log.e("OnLoadMoreListener", "The OnLoadMoreListener only support LinearLayoutManager");
            return;
        }
        if (lastItemCount != itemCount && lastPosition == itemCount - 1) {
            lastItemCount = itemCount;
            this.onLoadMore();
        }
    }
}

作者:我爱吃青苹果
链接:https://www.jianshu.com/p/66d817325e94
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

// Recyclerview 数据不全/数据加载不全

recyclerview 外部添加一个布局

<RelativeLayout
	android:layout_width="match_parent"
	android:layout_height="match_parent">

	<android.support.v7.widget.RecyclerView
		android:layout_width="match_parent"
		android:layout_height="match_parent"
		android:overScrollMode="never"
		android:scrollbars="none" />
</RelativeLayout>

// android 支付宝 AliPayDemo154 秘钥获取

// 支付宝 生成秘钥工具secret_key_tools_RSA256_win 打不开

该文件不能放在有中文目录、空格的目录当中执行。

秘钥生成工具支付宝提供-也可以从官网下载


// Android studio 3.1.2 编辑layout(xml) 文件特别卡顿

Android studio 3.1.2 降级到 3.0.1 会好一些,3.1.3 也没有问题。


// BluetoothAdapter: Bluetooth binder is null

解决方案:

1、Androidmanifest.xml 没有蓝牙权限:

<!--用于申请获取蓝牙信息进行室内定位-->
<uses-permission android:name="android.permission.BLUETOOTH"></uses-permission>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"></uses-permission>

2、androidmanifest.xml 文件中有报错。

3、使用的是模拟器,模拟器没有蓝牙的功能。

参考文章:https://stackoverflow.com/questions/14474370/e-bluetoothadapter883-bluetooth-binder-is-null#


// recyclerview 滑动不流畅(ScrollView 嵌套 recyclerview 滑动不流畅)

// recyclerview 打开这个

recyclerView.setNestedScrollingEnabled(false);

参考文章

https://blog.csdn.net/xuwei1213/article/details/53994679

https://blog.csdn.net/u010696826/article/details/52808323


// recyclerview 复用,数据重复,滑动导致数据重复,不复用

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
	holder.setIsRecyclable(false);

// 获取 recyclerview 的 itemview

// RecyclerView获取ItemView方法实际比较简单,直接用LayoutManager实例的方法:
// positions是RecyclerView中每个item的位置
View view = layoutManager.findViewByPosition(position);

// 但是在fragment中如果直接调用上面的方法,返回的view为空,我们需要用handler的postDelayed方法延迟获取。

static Handler handler = new Handler(Looper.getMainLooper());

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    handler.postDelayed(runnable, 200);
}

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        View view = layoutManager.findViewByPosition(position);
    }
};

作者:康熙微博私访记
链接:https://www.jianshu.com/p/3824147a80bf
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

// Banner 的属性

https://blog.csdn.net/android_mylife/article/details/53213678


// android 动态设置控件的高度,使用对应布局中的dp值

https://blog.csdn.net/shuang__zi/article/details/46360697


// recyclerview 内容不显示

1.没有设置布局管理器。

2.item的高度为 match_parent,改为固定值、或者wrap_content。


// Android Studio遇到报错:cannot delete xxx file

参考:这里

删除对应文件的上一级目录


// popupWindow 点击返回键 back 没有反应(popuwindow)

popupwindow设置一个参数:参考文章

popupWindow.setBackgroundDrawable(new BitmapDrawable());

// RecyclerView 中的 item 布局混乱

item 中的布局使用了weight 时,会失效。

解决方法:最外层使用 Relativelayout


// 获取 activity 中显示的是哪一个 fragment

FragmentManager fmanager;
        FragmentTransaction ftransaction;
        fmanager = getSupportFragmentManager();
        ftransaction = fmanager.beginTransaction();
        @SuppressLint("RestrictedApi")
        List<Fragment> fragmentList = fmanager.getFragments();
        for (Fragment fragment : fragmentList) {
            if(fragment != null && fragment.isVisible()){
//                Log.e("fragment.isVisible",""+fragment.toString().substring(0,fragment.toString().indexOf("{")));
                switch (""+fragment.toString().substring(0,fragment.toString().indexOf("{"))) {
                    case "HomeFragment":
                        mRadioButtonHome.setChecked(true);
                        break;
                    case "ClassifyFragment":
                        mRadioButtonClassfity.setChecked(true);
                        break;
                }
            }
        }

// xml 无法显示,报错:Failed to load AppCompat ActionBar with unknown error.

参考:https://blog.csdn.net/qq_36332133/article/details/80808123

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
</style>

改为

<style name="AppTheme" parent="Base.Theme.AppCompat.Light.DarkActionBar">
</style>

 

发表评论

zh_CNChinese
zh_CNChinese