android解决坚屏拍照和保存图片旋转90度的问题,并兼容4.0

 第一步: AndroidManifest.xml 在Activity添加以下一个属性

android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="sensor",为的是能够横竖屏切换不用再次调用onCreate方法,直接调用onConfigurationChanged方法。screenSize是兼容4.0系统的才可以生效,否则方法没效。
<application android:label="@string/app_name"
        android:icon="@drawable/ic_launcher">
       <activity android:name=".MainActivity" 
                  android:label="@string/app_name"
                  android:configChanges="orientation|keyboardHidden|screenSize" android:screenOrientation="sensor"
            <intent-filter> 
                <action android:name="android.intent.action.MAIN" /> 
                <category android:name="android.intent.category.LAUNCHER" /> 
            </intent-filter> 
        </activity>
    </application>

第二步,解决竖屏拍照后保存图片会旋转90度的问题。这里我会在onConfigurationChanged方法进行判断当前是横拍还是竖拍,然后在调用相机拍照后,在保存图片的方法里,进行竖拍的照片90度旋转。

     

PictureCallback jpeg = new PictureCallback() { 
           
        @Override 
        public void onPictureTaken(byte[] data, Camera camera) { 
            // TODO Auto-generated method stub 
             Bitmap bMap;
            try 
            {// 获得图片 
                  
                 
                bMap = BitmapFactory.decodeByteArray(data, 0, data.length); 
                  
                Bitmap bMapRotate; 
                if (takeType != 0) {  //坚拍
                    Matrix matrix = new Matrix(); 
                    matrix.reset(); 
                    matrix.postRotate(90); 
                    bMapRotate = Bitmap.createBitmap(bMap, 0, 0, bMap.getWidth(), 
                            bMap.getHeight(), matrix, true);
                    bMap = bMapRotate;
                }
           
           // Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length); 
            File file = new File(filePath); 
            BufferedOutputStream bos = 
                new BufferedOutputStream(new FileOutputStream(file)); 
            bMap.compress(Bitmap.CompressFormat.JPEG, 100, bos);//将图片压缩到流中 
            bos.flush();//输出 
            bos.close();//关闭 
            }catch(Exception e) 
            
                e.printStackTrace(); 
            
               
        
    }; 

  关键代码是以上。

 

 当用竖拍转横拍,还是横拍转竖拍,都要先在surfaceChanged方法,停止预览相机,重新设置下摄像头就不会再出现90度旋转。

  

源码下载

posted @   吴超文  阅读(12104)  评论(7编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示