实现拍照上传-图片压缩-base64上传网页 亲测_jiaxi的天空的博客-程序员秘密

技术标签: android  

 

魅族note6(android 7) png jpg测试正常

文件大小测试正常

0.文件大小349(kb)            通过Options获取到的图片大小width:450 height: 1920

新文件大小51(kb)            通过Options获取到的图片大小width:187 height: 800

1.文件大小3520(kb)            通过Options获取到的图片大小width:3120 height: 4208

新文件大小531(kb)            通过Options获取到的图片大小width:800 height: 1078

2. 文件大小197(kb)            通过Options获取到的图片大小width:640 height: 415

新文件大小198(kb)            通过Options获取到的图片大小width:640 height: 415

 

 

代码

package com.by.yuquan.app.webview;

import android.Manifest;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.PixelFormat;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.provider.MediaStore;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v4.content.FileProvider;
import android.text.TextUtils;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.webkit.JavascriptInterface;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.by.yuquan.app.R;
import com.by.yuquan.app.base.ActivityInterface;
import com.by.yuquan.app.base.CallBackIntent;
import com.by.yuquan.app.base.baichuan.BaiChuanUtils;
import com.by.yuquan.app.base.dialog.TaoBaoQuanDaoDialog;
import com.by.yuquan.app.base.utils.Logi;
import com.by.yuquan.app.base.utils.ToastUtils;
import com.by.yuquan.app.base.zxing.android.CaptureActivity;
import com.by.yuquan.app.webview.base.JsApi;
import com.by.yuquan.app.webview.base.WebViewBaseObject1;
import com.by.yuquan.app.webview.base1.BaseWebViewActivity1;
import com.by.yuquan.app.webview.base1.CompletionHandler;
import com.by.yuquan.app.webview.base1.OnReturnValue;
import com.by.yuquan.app.webview.google.AutoTitleWebViewActiuvity;
import com.by.yuquan.app.wxapi.WXPayEntryActivity;
import com.by.yuquan.base.AppUtils;
import com.by.yuquan.base.ImageBase64;
import com.by.yuquan.base.SharedPreferencesUtils;
import com.by.yuquan.base.ZpImageUtils;
import com.tencent.smtt.sdk.WebView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;

import static android.os.Environment.DIRECTORY_PICTURES;

public class AutoWebViewActivity1 extends BaseWebViewActivity1 implements ActivityInterface {

    //activity回调方法
    public CallBackIntent mCallBackIntent;
    private final int REQUEST_TAKE_CODE = 51;
    private final int REQ_CHOOSE = 50;
    private File mTakePhotoFile;
    private File mFileFromCamera;
    public LinearLayout topbar_layout;
    private CompletionHandler<String> albc_handler;
    private CompletionHandler<String> completeHandler;

    private static final int REQUEST_CODE_SCAN = 0x0001;
    private CompletionHandler<String> scan_handler;
    private static final String DECODED_CONTENT_KEY = "codedContent";

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        webView = findViewById(R.id.webView);
        webView.addJavascriptInterface(new AutoWebViewActivity1.InJavaScriptLocalObj(), "java_obj");
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        topbar_layout = findViewById(R.id.topbar_layout);
        int barHeight = getStateBarHeight();
        if (barHeight != 0) {
            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, barHeight);
            topbar_layout.setLayoutParams(layoutParams);
            topbar_layout.setVisibility(View.VISIBLE);
        }
    }

    @Override
    public WebViewBaseObject1 getObjcet1() {
        return new MyWebViewBaseObject(this);
    }

    @Override
    public JsApi getObjcet2() {
        return new JsApi(this);
    }

    @Override
    public WebViewBaseObject1 getObjcet() {
        return new MyWebViewBaseObject(this);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 5:
                int taAuth = (Integer) SharedPreferencesUtils.get(this, "TBAUTH", 1);//0:不需要授权(已授权) 1:需要授权(未授权)
                if (taAuth == 0) {
                    albc_handler.complete("success");
                } else {
                    albc_handler.complete("fail");
                }
                break;
            case REQ_CHOOSE://选择图片回调
                try {
                    String imageStr = "";
                    if (resultCode == Activity.RESULT_OK) {
                        if (data != null) {
                            String dataString = data.getDataString();
                            if (dataString != null) {
                                Uri uri = Uri.parse(dataString);
//                                File imgFile = ZpImageUtils.compressImage(this, getRealPathFromURI(uri), 200, 200, 150);
                                //                            imageStr = ImageBase64.getImageStr(getRealPathFromURI(uri));
                                //                            results = new Uri[]{Uri.parse(dataString)};
                                File imgFile = new File(getRealPathFromURI(uri));
                                if (imgFile.getName().toLowerCase().contains(".jpg") || imgFile.getName().toLowerCase().contains(".png") || imgFile.getName().toLowerCase().contains(".jpeg") || imgFile.getName().toLowerCase().contains(".gif")) {
                                    compressImage(imgFile.getAbsolutePath(),AutoWebViewActivity1.this);
//                                    imgFile=new File(tmpPath);
//                                    imageStr = "data:image/jpeg;base64," + ImageBase64.fileToBase64(imgFile);
                                } else {
                                    com.by.yuquan.base.ToastUtils.show(AutoWebViewActivity1.this, "请选择图片");
                                    return ;
                                }

                            }
                        }
                    }
                  //  completeHandler.complete(imageStr);
                } catch (Exception e) {
                }
                break;
            case REQUEST_TAKE_CODE://拍照回调
                try {
                    String imageStr = "";
                    if (resultCode == Activity.RESULT_OK) {
                        if (mFileFromCamera != null) {
                            String filePath = mTakePhotoFile.getAbsolutePath();
                            // 压缩图片到指定大小
//                            File imgFile = ZpImageUtils.compressImage(this, filePath, 100, 100, 100);
                            File imgFile = new File(filePath);
                            Uri localUri = Uri.fromFile(imgFile);
                            Intent localIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, localUri);
                            this.sendBroadcast(localIntent);
                            Uri result = Uri.fromFile(imgFile);
                            if (imgFile.getName().toLowerCase().contains(".jpg") || imgFile.getName().toLowerCase().contains(".jpeg") || imgFile.getName().toLowerCase().contains(".png") || imgFile.getName().toLowerCase().contains(".gif")) {
                                compressImage(imgFile.getAbsolutePath(),AutoWebViewActivity1.this);
                            } else {
                                com.by.yuquan.base.ToastUtils.show(AutoWebViewActivity1.this, "请选择图片");
                                return ;
                            }

                        }
                    }

                } catch (Exception e) {
                }
                break;
            case REQUEST_CODE_SCAN://扫码
                if (resultCode == this.RESULT_OK) {
                    if (data != null) {
                        //返回的文本内容
                        String content = data.getStringExtra(DECODED_CONTENT_KEY);
                        //返回的BitMap图像
//                Bitmap bitmap = data.getParcelableExtra(DECODED_BITMAP_KEY);
                        if (scan_handler != null) {
                            scan_handler.complete(content);
                        }
                    }
                }
                break;
        }
    }
    long x=0;
    long y=0;
    /**
     * 压缩 图片 ,
     * @param path 绝对路径
     * @param context 对象
     * @return
     */
    private void compressImage(final String path,final Context context) {
        //500kb 最大 [由于1半]
        int maxlenth=1024*1024;
        try{
            //如果设置为空,则获取的bitmap为空,
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;//这个参数设置为true才有效,
            Bitmap bmp = BitmapFactory.decodeFile(path, options);//这里的bitmap是个空
            if (bmp == null) {//这里说明没去获取,只获取宽高参数
               // Logi.e( "通过options获取到的bitmap为空 ===");
            }

           // double g= 12.35; BigDecimal bigG=new BigDecimal(g).setScale(1, BigDecimal.ROUND_HALF_UP); //期望得到12.4

            int outHeight = options.outHeight;
            int outWidth = options.outWidth;
//          换算逻辑
//          1mb=1024*1024 byte
            long len=new File(path).length();
            Logi.i( path+" 文件大小"+len/1024+"(kb)            通过Options获取到的图片大小" + "width:" + outWidth + " height: " + outHeight);
            //如果宽大于800 按800算
            final int totalMax=800;
            if(outWidth>=totalMax){
                x=totalMax;
                y=outHeight*x/(outWidth);
            }else if(outHeight>=totalMax){
                y=totalMax;
                x=outWidth*y/(outHeight);
            }else{
                //原来尺寸
                x=outWidth;
               y=outHeight;
            }

//
//            //.divide(new BigDecimal(len)); 会Non-terminating decimal expansion; no exact representable decimal result。 所以必须要 具体多少小数点
//            BigDecimal tmp=(new BigDecimal(outWidth*maxlenth)).divide(new BigDecimal(len),2,BigDecimal.ROUND_HALF_UP);
//             x=tmp.intValue();
//            tmp=(new BigDecimal(outHeight*maxlenth)).divide(new BigDecimal(len),2,BigDecimal.ROUND_HALF_UP);
//             y=tmp.intValue();
             //防止文件少于500k 就不压缩了
//            if(maxlenth>=len){
//                x=outWidth;
//                y=outHeight;
//            }
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try{
                        Bitmap bitmap = Glide.with(context)
                                .asBitmap()
                                .load(path)
                                .submit(Integer.parseInt(""+x),Integer.parseInt(""+y))
                                .get();



                        Bitmap.CompressFormat format=Bitmap.CompressFormat.PNG;
                        String ext=""+System.currentTimeMillis();
                        ext=ext.substring(ext.length()-3);//之所以要加个字符串 因为有时候bitmap.recycle()然后用户又同时上传
                        String stringImage=ext+".hash";//这里本来.jpg要跟文件一样 奈何小米android 10 删除图片会显示提示
                        //选同一张图片 连续选
                        if(path.toLowerCase().endsWith(".jpg")){
//                            stringImage=".jpg";
                            format=Bitmap.CompressFormat.JPEG;
                        }

                        final String tmpPath=path+""+stringImage;
                        FileOutputStream out = new FileOutputStream(tmpPath+"");

                        bitmap.compress(format, 100, out);
                        out.flush();
                        out.close();
                        bitmap.recycle();

                        Logi.i( tmpPath+""+"新文件大小"+new File(tmpPath+"").length()/1024+"(kb)            通过Options获取到的图片大小" + "width:" + x + " height: " + y);
                        Activity activity= (Activity) context;
                        activity.runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                try{
                                    File imgFile=new File(tmpPath);
                                    String imageStr = "data:image/jpeg;base64," + ImageBase64.getImageStr(imgFile.getAbsolutePath());
                                    completeHandler.complete(imageStr);
                                    new File(tmpPath).delete();
                                }catch (Exception e){
                                    Logi.e(e);
                                }

                            }
                        });
                    }catch (Exception e){
                        Logi.e(e);
                    }
                }
            }).start();

        }catch (Exception e){
            Logi.e(e);
        }


}
//    private Bitmap compressImage(Bitmap image) {
//
//        ByteArrayOutputStream baos = new ByteArrayOutputStream();
//        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中
//        int options = 100;
//        while ( baos.toByteArray().length / 1024>100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩
//            baos.reset();//重置baos即清空baos
//            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中
//            options -= 10;//每次都减少10
//        }
//        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中
//        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片
//        return bitmap;
//    }

    protected void onRestart() {
        super.onRestart();
        if (mBaseObject.payCallBack != null && WXPayEntryActivity.ERRCORD != -10) {
            if (WXPayEntryActivity.ERRCORD == 0) {
                mBaseObject.payCallBack.complete("0");
            } else {
                mBaseObject.payCallBack.complete("-1");
            }
            WXPayEntryActivity.ERRCORD = -10;
        }
    }

    @Override
    public void success() {
        try {
            //避免A标签不能点击跳转问题
            String touchFromA = "var href=document.getElementsByTagName('a');" +
                    "for(var i=0;i<href.length;i++){\n" +
                    " if(href[i].href=='' || href[i].href=='null' || href[i].href=='javascript:;' || href[i].href=='javascript:'){continue;}" +
                    "href[i].onclick=function()" +
                    "{" +
                    "window.location.href=this.getAttribute(\"href\");" +
                    "}" +
                    "};";
            webView.loadUrl("javascript:" + touchFromA + "");
            if (!TextUtils.isEmpty(injection_js)) {
                webView.loadUrl("javascript:" + injection_js + "");
            }
            webView.callHandler("deviceType", new Object[]{"android"}, new OnReturnValue<Integer>() {
                @Override
                public void onValue(Integer retValue) {

                }
            });
            //--------------
//            webView.loadUrl("javascript:window.java_obj.getSource('<head>'+" +
//                    "document.getElementsByTagName('html')[0].innerHTML+'</head>');");
        } catch (Exception e) {
        }

        try {
            webView.callHandler("getVersion", new Object[]{AppUtils.getVerName(this)}, new OnReturnValue<Integer>() {
                @Override
                public void onValue(Integer retValue) {

                }
            });
        } catch (Exception e) {
        }
    }


    @Override
    public int initInflater() {
        return R.layout.basewebviewactivity_layout1;
    }

    @Override
    public void onClick(View v) {

    }

    @Override
    public void setIsFullScreen(boolean isFullScreen) {
        if (isFullScreen) {
            topbar_layout.setVisibility(View.GONE);
        }
    }

    @Override
    public void startActivityForResultInf(Intent intent, CallBackIntent callBackIntent) {
        this.mCallBackIntent = callBackIntent;
        startActivityForResult(intent, REQUEST_TAKE_CODE);
    }

    class MyWebViewBaseObject extends WebViewBaseObject1 {
        String oauth_url = "";

        public MyWebViewBaseObject(Context context) {
            super(context);
        }

        private TaoBaoQuanDaoDialog taoBaoQuanDaoDialog;

        /**
         * 阿里百川授权
         */
        @JavascriptInterface
        public void albcAuth(Object params, CompletionHandler<String> handler) {
            albc_handler = handler;
            if (taoBaoQuanDaoDialog == null) {
                taoBaoQuanDaoDialog = new TaoBaoQuanDaoDialog(AutoWebViewActivity1.this, R.style.dialog, "由于淘宝需要对渠道加强精细化管理,邀请您进行淘宝身份认证操作,届时没有进行身份认证得,将可能无法分享推广淘宝商品功能,请您提前认证。", new TaoBaoQuanDaoDialog.OnCloseListener() {
                    @Override
                    public void onClick(Dialog dialog, boolean confirm) {
                        try {
                            oauth_url = ((JSONObject) params).getString("url");
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        if (TextUtils.isEmpty(oauth_url)) {
                            albc_handler.complete("fail");
                            return;
                        }
                        if (confirm) {//开始认证
                            BaiChuanUtils.getInstance(AutoWebViewActivity1.this).auth(oauth_url);
                        }
                    }
                }).setTitle("淘宝渠道认证");
            }
            if (!taoBaoQuanDaoDialog.isShowing()) {
                taoBaoQuanDaoDialog.show();
            }
        }

        /**
         * 相册选择图片
         */
        @JavascriptInterface
        public void getPicture(Object params, CompletionHandler<String> handler) {
            completeHandler = handler;
            selectImage();
        }

        /**
         * 拍图片
         *
         * @param params
         */
        @JavascriptInterface
        public void getCamera(Object params, CompletionHandler<String> handler) {
            completeHandler = handler;
            takeCameraPhoto();
        }


        @JavascriptInterface
        public void FNScanner(Object parms, CompletionHandler<String> handler) {
            if (ContextCompat.checkSelfPermission(AutoWebViewActivity1.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(AutoWebViewActivity1.this, new String[]{Manifest.permission.CAMERA}, 1);
            } else {
                scan_handler = handler;
                Intent intent = new Intent(AutoWebViewActivity1.this, CaptureActivity.class);
                startActivityForResult(intent, REQUEST_CODE_SCAN);
            }
        }
    }

    /**
     * 选择照片
     */
    private void selectImage() {
        Intent intent;
        if (Build.VERSION.SDK_INT < 19) {
            intent = new Intent(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            startActivityForResult(intent, REQ_CHOOSE);
        } else {
            intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            Intent wrapperIntent = Intent.createChooser(intent, null);
            startActivityForResult(wrapperIntent, REQ_CHOOSE);
        }
    }

    /**
     * 拍照方案1
     */
    public void takeCameraPhoto() {
        if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY)) {
            ToastUtils.showCenter(this, "设备无摄像头");
            return;
        }

        String filePath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getAbsolutePath();

        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        mFileFromCamera = new File(filePath, System.nanoTime() + ".jpg");
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
            intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(mTakePhotoFile));
            startActivityForResult(intent, REQUEST_TAKE_CODE);
        } else {
            try {
                mTakePhotoFile = File.createTempFile("Zp" + System.nanoTime(), ".jpg", new File(filePath));
                Uri contentUri = FileProvider.getUriForFile(this,
                        getPackageName() + ".fileProvider", mTakePhotoFile);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, contentUri);
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                startActivityForResult(intent, REQUEST_TAKE_CODE);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 拍照方案2
     */
    public void takePic() {
        try {
            String state = Environment.getExternalStorageState();
            if (state.equals(Environment.MEDIA_MOUNTED)) {
                Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                File mFile = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES), "temp.jpg");
                ///storage/emulated/0/Pictures/temp.jpg
                Uri mImageUri = Uri.fromFile(mFile);
                if (Build.VERSION.SDK_INT > Build.VERSION_CODES.N) {
                    //content://com.example.shinelon.takephotodemo.provider/camera_photos/Pictures/temp.jpg
                    mImageUri = FileProvider.getUriForFile(this, getPackageName() + ".fileProvider", mFile);
                }
                //指定照片保存路径(SD卡),temp.jpg为一个临时文件,每次拍照后这个图片都会被替换
                cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, mImageUri);
                cameraIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                startActivityForResult(cameraIntent, REQUEST_TAKE_CODE);
            } else {
                ToastUtils.showCenter(this, "请确认已经插入SD卡");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 根据uri获取真实路径
     *
     * @param contentUri
     * @return
     */
    public String getRealPathFromURI(Uri contentUri) {
        String res = null;
        String[] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
        if (cursor.moveToFirst()) {
            int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            res = cursor.getString(column_index);
        }
        cursor.close();
        return res;
    }


    final class InJavaScriptLocalObj {
        @JavascriptInterface
        public void getSource(String html) {
            Log.d("html=", html);
        }
    }
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/hejias/article/details/116644107

智能推荐

SQL*Loader-951错误_small_well的博客-程序员秘密

<br />在使用datastage开发的时候,遇到错误:<br />SQL*Loader-951: Error calling once/load initialization<br />ORA-00604: error occured at recursive SQL level 1<br />ORA-00054: resource busy and acquire with NOWAIT specified<br />搬出谷歌大神:<br />     可能是表里索引处于 unusable sta

CentOS上安装Hadoop_风流学霸段公子的博客-程序员秘密

Linux介绍Linux的特点我想大多数小伙伴使用的操作系统都是GUI界面更为完善得Windows系统,当然很多常用的软件都可以在两种系统上兼容运行,因此对于命令行界面的为主的Linux并不热情。然而作为一个IT人士,不懂Linux仿佛有点说不过去,毕竟大佬都是对着一块黑乎乎的都是代码的界面敲键盘,而你却对着图形用户界面指指点点,想想就有些low,况且Linux有着一些很重要的优点:仿Un...

HALCON算子 - SetSystem_set system_zhy29563的博客-程序员秘密

用于设置HALCON的系统参数    static void HOperatorSet.SetSystem(HTuple systemParameter, HTuple value)    static void HSystem.SetSystem(HTuple systemParameter, HTuple value)    static void HSystem.SetSyste...

layer.confirm 询问框 的层遮盖_weixin_34024034的博客-程序员秘密

function admin_del(obj) { layer.confirm('确认要重启吗?', { btn : [ '确定', '取消' ]//按钮 }, function(index) { layer.close(index); //此处请求后台程序,下方是成...

深入浅出 Java 8 Lambda 表达式_hao_yunfeng的博客-程序员秘密

http://blog.oneapm.com/apm-tech/226.html摘要:此篇文章主要介绍 Java8 Lambda 表达式产生的背景和用法,以及 Lambda 表达式与匿名类的不同等。本文系 OneAPM 工程师编译整理。Java 是一流的面向对象语言,除了部分简单数据类型,Java 中的一切都是对象,即使数组也是一种对象,每个类创建的实例也是对象。在 Java 中定义的函数...

ASP.NET 2.0 中的数据访问_Single的博客-程序员秘密

       ASP.NET 2.0 中的数据访问 发布日期: 2006-1-13适用于:Microsoft ASP.NET 2.0Microsoft ADO.NET 2.0Microsoft Visual Studio 2005摘要: ASP.NET 2.0 通过增加一些支持数据的控件,从而减少了执行普通的数据访问任务所需的代码数量。本文介绍这些新增控件,以及如何在应用程

随便推点

android 自定义锁屏api,Android锁屏小部件_内含子的博客-程序员秘密

锁屏互动很难。 Android允许使用两个窗口标志(FLAG_SHOW_WHEN_LOCKED和FLAG_DISMISS_KEYGUARD)进行基本操作。 FLAG_SHOW_WHEN_LOCKED的工作原理非常一致,即使启用了安全性,它也会显示在锁定屏幕的顶部(不会绕过安全性,您无法切换到另一个非FLAG_SHOW_WHEN_LOCKED窗口)。如果您只是在做一些临时的事情,例如在播放音乐或类似...

oracle恢复表中误删的数据_loongshawn的博客-程序员秘密

1. 背景大家有时候在迁移数据库或执行数据库相关操作时,可能会碰见误删了表中的数据,这时你一定很着急。先别慌,恭喜你用的是oracle数据库,oracle数据库有自动回滚的功能,可以依据时间恢复到指定时间点前的数据。2. 操作CREATE TABLE QUICK_TABLE AS SELECT * FROM TABLE_NAME AS OF TIMESTAMP SYSDATE-1/24其中T

谷歌/FOFA搜索引擎使用_莫黎小天的博客-程序员秘密

谷歌搜索引擎的使用1.谷歌语法利用搜索引擎在渗透测试过程搜索到特定页面的一种语法“xxx” :将要搜索的关键字用引号括起来(表示完全匹配,即关键词不能分开,顺序也不能变)+:“xxx” +baidu.com 搜索xxx与baidu.com相关的内容-: “xxx”-baidu.com 搜索结果里面除去baidu.com相关的内容2.谷歌语法基础使用site:指定域名,如:site:edu.cninurl:用于搜索包含的url关键词的网页,如:inurl:login 搜索

patreon 赞助取消_什么是Patreon,它如何工作?_culunyi0802的博客-程序员秘密

patreon 赞助取消Many online content creators use Patreon to supplement their income. How does it work, and should you support your favorite internet content creator on the site? Find out here. 许多在线内容创建者使...

poj 2155 (含解释)二维树状数组_weixin_30916125的博客-程序员秘密

传送门:https://vjudge.net/problem/POJ-2155题意:给你一个n*n的01矩阵,初始时为0,然后每次有两种操作,第一种是一个子矩阵的翻转,另一种是询问某点的值。这题是从白书上来的,增加了我对二维数组的理解。我们先想一下一维的情况,要实现一个区间增加某一个值,只需要用差分数组,每次实现操作只需要a[l]+1,以及a[r+1]-1,便可。但是二维用差分数组...

C# BitmapImage对象和byte[]之间的互转、BitmapImage和Bitmap互换_bitimage转byte[]_gooapple的博客-程序员秘密

/// /// byte[]转为BitmapImage /// /// /// public static BitmapImage ToImage(byte[] byteArray) { BitmapImage bmp = null; try