android 4.4 切换语言及解决切换语言黑屏的问题

本文详细介绍了在Android 4.4中切换语言导致黑屏的问题及其解决方案。通过创建一个Activity并在manifest中设置特定权限和属性,包括android:configChanges、android:sharedUserId和<uses-permission>,并解决安装时的签名问题,成功实现在应用中即时切换语言而避免黑屏现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        最近在项目开发中遇到一个很奇怪的问题,就是在语言切换后有的apk会黑屏且这个时候不在响应操作。看现象感觉是apk卡死或者挂掉了,但是通过ps查看应用的进程是正常运行的。后来就自己写了一个apk专门切换语言,下面是完成的过程写出来供大家参考。


public class MainActivity extends Activity {

    private Bundle bundle = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        bundle = savedInstanceState;
        setContentView(R.layout.activity_main);
        Log.d("wdp_test", "oncreate----->");
        new Thread()
        {
            public void run()
            {
                try {
                    Thread.sleep(3000);
                    setlanguage();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }.start();
    }
    
@Override
    public void onConfigurationChanged(Configuration newConfig) {
        // TODO Auto-generated method stub
        super.onConfigurationChanged(newConfig);
        Log.d("wdp_test", "onConfigurationChanged----->");
        this.onCreate(bundle);
        //Toast.makeText(this, "onConfigurationChanged", Toast.LENGTH_LONG).show();
    }
@Override
protected void onDestroy() {
    // TODO Auto-generated method stub
    super.onDestroy();
    Log.d("wdp_test", "onDestory---->");
    //finish();
}
private void setlanguage(){
        // TODO Auto-generated method stub
    //Toast.makeText(this, "chang lang", Toast.LENGTH_LONG).show();
    IActivityManager am = ActivityManagerNative.getDefault();    
    try {
        Configuration config = am.getConfiguration();
         Locale loc =null;// mLocales[position];  
         Log.d("wdp_test", "now language is "+Locale.getDefault().getLanguage());
         if(Locale.getDefault().getLanguage().contains("zh")) //获得当前语言并判断是否是中文
        
             config.locale =  Locale.ENGLISH; //Locale类中定义了各种语言
         }else
         {
             config.locale = Locale.CHINA;
         }
        am.updateConfiguration(config);
        BackupManager.dataChanged("com.android.providers.settings");

    } catch (RemoteException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    
    }
}


上面是我实现的很简单的apk用来不断的在中文和英文之间切换,现在就来分析一下这段代码,因为要不断的切换语言所以在oncreat中就开了一个线程每隔3秒中就调用一次设置语言的函数setlanguage,这个函数是用来实现语言切换的,如上面红色字体的一段,是android标准的设置语言的方法这里就不在多说了。完成了上面的一段之后我们还需要在androimanifest.xml中添加一些属性,直接贴代码

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.languagetest"

     android:sharedUserId="android.uid.system"
    android:versionCode="1"
    android:versionName="1.0"
    android:configChanges="locale|layoutDirection">

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />
        <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/>  

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.languagetest.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

因为我们的程序中需要改变语言就要在manifest中添加相应的权限,android:configChanges="locale|layoutDirection"和  <uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/> 
添加了这样的连个配置我们的程序就会在系统config发生变化时监听这个消息,也有了android.permission.CHANGE_CONFIGURATION

的权限,这个时候导出apk在平台上运行,就会包下面的错误

E/AndroidRuntime( 1653): FATAL EXCEPTION: Thread-82
E/AndroidRuntime( 1653): Process: com.example.languagetest, PID: 1653
E/AndroidRuntime( 1653): java.lang.SecurityException: Permission Denial: updateConfiguration() from pid=1653, uid=10019 requires android.permission.CHANGE_CONFIGURATION

permission denial就是没有权限,可是manifest中明明已经添加了这个权限了,这是为什么呢,经过很多的分析,很可能是因为我们需要system的权限,所以在manifest中添加属性android:sharedUserId="android.uid.system" 这个属性可以让我们运行在system进程中拥有sytstem的权限,然后再pm install  安装程序的时候报错Failure [INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]  ,参考了http://blog.youkuaiyun.com/mypotatolove/article/details/44155767和http://www.apkbus.com/android-152345-1-1.html两篇文章添加这个属性后需要有系统签名,所以把源码放到了android整个代码下添加android.mk后编译,这样生成的apk就有了系统签名。

再次运行就ok了,这样就完成了在自己的apk中实现语言的立即切换。

<think>嗯,用户问的是关于Android WebView内嵌H5视频全屏播放的问题。我需要先回忆一下相关的知识点。首先,WebView默认可能不支持全屏播放,特别是H5的视频元素。可能需要配置WebView的一些设置,比如启用JavaScript和DOM存储,可能还需要处理全屏请求的回调。 接下来,用户可能需要具体的步骤,比如如何设置WebChromeClient,重写onShowCustomView方法,处理全屏的进入和退出。记得要提到WebView的硬件加速,因为视频播放可能需要这个。 另外,权限问题也很重要,比如在AndroidManifest.xml中声明硬件加速,还有网络权限。H5页面方面,可能需要检查视频标签的属性,比如是否允许全屏,比如playsinline或者webkit-playsinline。 还有全屏时的自定义视图处理,比如隐藏系统UI,设置横屏模式,或者使用自定义的全屏布局。可能还需要处理返回键,退出全屏状态。 需要注意不同Android版本的兼容性,特别是从Android 5.0开始,一些API的变化。另外,第三方浏览器内核可能会有不同的表现,可能需要额外处理。 有没有遗漏的地方?比如,是否要覆盖onHideCustomView来恢复视图?或者如何处理全屏时的方向切换?还有可能提到的常见问题,比如视频不能自动播放,需要用户交互触发。 总之,结构应该是先介绍基本配置,然后详细步骤,包括Java代码示例和注意事项,最后可能给出常见问题解决方法。确保语言简洁,步骤清晰,用户能一步步实现。</think>在 Android WebView 中实现 H5 视频全屏播放,需要处理以下几个关键步骤: ### 一、基础配置 ```java webView.settings.apply { javaScriptEnabled = true // 启用JS domStorageEnabled = true // 启用DOM存储 mediaPlaybackRequiresUserGesture = false // 允许自动播放 setSupportMultipleWindows(true) // 支持多窗口(全屏需要) } ``` ### 二、核心处理类 需自定义 `WebChromeClient` 处理全屏事件: ```java webView.webChromeClient = object : WebChromeClient() { private var customView: View? = null // 处理全屏请求 override fun onShowCustomView(view: View?, callback: CustomViewCallback?) { handleFullscreenEnter(view, callback) } // 退出全屏 override fun onHideCustomView() { handleFullscreenExit() } } ``` ### 三、全屏处理逻辑 ```java private fun handleFullscreenEnter(view: View?, callback: CustomViewCallback?) { // 隐藏系统UI window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // 添加全屏视图 (context as? Activity)?.window?.addContentView( view, FrameLayout.LayoutParams(MATCH_PARENT, MATCH_PARENT) ) customView = view } private fun handleFullscreenExit() { // 移除全屏视图 (customView?.parent as? ViewGroup)?.removeView(customView) customView = null // 恢复系统UI window.decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE } ``` ### 四、AndroidManifest 配置 ```xml <activity android:name=".MainActivity" android:hardwareAccelerated="true" <!-- 启用硬件加速 --> android:configChanges="orientation|screenSize"/> <!-- 防止页面重载 --> ``` ### 五、H5 页面注意事项 ```html <video controls playsinline <!-- iOS兼容 --> webkit-playsinline <!-- Android兼容 --> style="width:100%; height:auto"> </video> ``` ### 六、常见问题处理 1. **黑屏问题**:检查硬件加速是否开启 2. **方向切换异常**:确保 Activity 配置了 `configChanges` 3. **全屏按钮不显示**:确认视频 `controls` 属性已添加 4. **自动播放失败**:Android 8.0+ 需要用户手势触发 ### 七、高级优化 1. 使用 `FrameLayout` 作为全屏容器 2. 监听返回键退出全屏: ```java override fun onBackPressed() { if (customView != null) { handleFullscreenExit() } else { super.onBackPressed() } } ``` 不同 Android 版本需注意: - Android 5.0+ 需要使用 `onShowCustomView` - 部分第三方内核(X5)需要特殊适配 - 建议最低兼容 API Level 19(Android 4.4
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值