精华内容
参与话题
问答
  • 新建一个Android项目,选择一个虚拟机运行Android项目 结果连虚拟机都启动不起来,启动时报如下错误: 2018/9/27 10:23 Emulator: emulator: ERROR: x86 emulation currently requires hardware acceleration! ...

    新建一个Android项目,选择一个虚拟机运行Android项目

    结果连虚拟机都启动不起来,启动时报如下错误:

    2018/9/27
    10:23    Emulator: emulator: ERROR: x86 emulation currently requires hardware acceleration!

    10:23    Emulator: CPU acceleration status: Unable to open HAXM device: ERROR_FILE_NOT_FOUND

    10:23    Emulator: Process finished with exit code 1

    后来到处科普后发现自己创建虚拟机的时候忘记选择镜像(需要下载)了

    这3项选择对应的API Level即可,该download的就download

    这样创建好的虚拟机就可以启动了。

    下面是Android Studio配置安卓虚拟机的步骤图:

    1.

    2.

    3.选择一款设备,建议选择分辨率小的,不占内存

    4.

    5.启动

    展开全文
  • 这是一个很常用的功能,并且这个功能在Android6.0、7.0、10.0等版本上实现都有所不同,需要对Android各个版本进行兼容适配,目前最新的Android版本是Android 10,所以这篇博客适配到Android 10。 调用相机,首先...

    今天写的博客是关于Android调用手机相机拍照并显示图片。这是一个很常用的功能,并且这个功能在Android6.0、7.0、10.0等版本上实现都有所不同,需要对Android各个版本进行兼容适配,目前最新的Android版本是Android 10,所以这篇博客适配到Android 10。

    调用相机,首先需要申请相机权限。

    <uses-permission android:name="android.permission.CAMERA" />
    

    android 6.0以后,相机权限需要动态申请。

       // 申请相机权限的requestCode
       private static final int PERMISSION_CAMERA_REQUEST_CODE = 0x00000012;
    
       /**
        * 检查权限并拍照。
        * 调用相机前先检查权限。
        */
       private void checkPermissionAndCamera() {
           int hasCameraPermission = ContextCompat.checkSelfPermission(getApplication(),
                   Manifest.permission.CAMERA);
           if (hasCameraPermission == PackageManager.PERMISSION_GRANTED) {
               //有调起相机拍照。
               openCamera();
           } else {
               //没有权限,申请权限。
               ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA},
                       PERMISSION_CAMERA_REQUEST_CODE);
           }
       }
    
       /**
        * 处理权限申请的回调。
        */
       @Override
       public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
           if (requestCode == PERMISSION_CAMERA_REQUEST_CODE) {
               if (grantResults.length > 0
                       && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                   //允许权限,有调起相机拍照。
                   openCamera();
               } else {
                   //拒绝权限,弹出提示框。
                   Toast.makeText(this,"拍照权限被拒绝",Toast.LENGTH_LONG).show();
               }
           }
       }
    

    申请权限后,就可以调起相机拍照了。调用相机只需要调用startActivityForResult传一个Intent就可以了,但是这个Intent需要传递一个uri,用于保存拍出来的图片,创建这个uri时,各个Android版本有所不同,需要进行版本兼容。

       //用于保存拍照图片的uri
        private Uri mCameraUri;
    
        // 用于保存图片的文件路径,Android 10以下使用图片路径访问图片
        private String mCameraImagePath;
    
        // 是否是Android 10以上手机
        private boolean isAndroidQ = Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q;
    
        /**
         * 调起相机拍照
         */
        private void openCamera() {
            Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            // 判断是否有相机
            if (captureIntent.resolveActivity(getPackageManager()) != null) {
                File photoFile = null;
                Uri photoUri = null;
    
                if (isAndroidQ) {
                    // 适配android 10
                    photoUri = createImageUri();
                } else {
                    try {
                        photoFile = createImageFile();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                    if (photoFile != null) {
                        mCameraImagePath = photoFile.getAbsolutePath();
                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                            //适配Android 7.0文件权限,通过FileProvider创建一个content类型的Uri
                            photoUri = FileProvider.getUriForFile(this, getPackageName() + ".fileprovider", photoFile);
                        } else {
                            photoUri = Uri.fromFile(photoFile);
                        }
                    }
                }
    
                mCameraUri = photoUri;
                if (photoUri != null) {
                    captureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);
                    captureIntent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                    startActivityForResult(captureIntent, CAMERA_REQUEST_CODE);
                }
            }
        }
    
        /**
         * 创建图片地址uri,用于保存拍照后的照片 Android 10以后使用这种方法
         */
        private Uri createImageUri() {
            String status = Environment.getExternalStorageState();
            // 判断是否有SD卡,优先使用SD卡存储,当没有SD卡时使用手机存储
            if (status.equals(Environment.MEDIA_MOUNTED)) {
               return getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
            } else {
                return getContentResolver().insert(MediaStore.Images.Media.INTERNAL_CONTENT_URI, new ContentValues());
            }
        }
    
        /**
         * 创建保存图片的文件
         */
        private File createImageFile() throws IOException {
            String imageName = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault()).format(new Date());
            File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
            if (!storageDir.exists()) {
                storageDir.mkdir();
            }
            File tempFile = new File(storageDir, imageName);
            if (!Environment.MEDIA_MOUNTED.equals(EnvironmentCompat.getStorageState(tempFile))) {
                return null;
            }
            return tempFile;
        }
    

    接收拍照结果和显示图片

        @Override
        protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (requestCode == CAMERA_REQUEST_CODE) {
                if (resultCode == RESULT_OK) {
                    if (isAndroidQ) {
                        // Android 10 使用图片uri加载
                        ivPhoto.setImageURI(mCameraUri);
                    } else {
                        // 使用图片路径加载
                        ivPhoto.setImageBitmap(BitmapFactory.decodeFile(mCameraImagePath));
                    }
                } else {
                    Toast.makeText(this,"取消",Toast.LENGTH_LONG).show();
                }
            }
        }
    

    这两需要说明一下,Android 10由于文件权限的关系,显示手机储存卡里的图片不能直接使用图片路径,需要使用图片uri加载。

    另外虽然我在这篇博客里对Android 10和10以下的手机使用了不同的方式创建uri 和加载图片,但其实Android 10创建uri的方式和使用uri加载图片的方式在10以下的手机是同样适用的。

    android 7.0需要配置文件共享。

    <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>
    

    在res目录下创建文件夹xml ,放置一个文件file_paths.xml(文件名可以随便取),配置需要共享的文件目录,也就是拍照图片保存的目录。

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <paths>
            <!-- 这个是保存拍照图片的路径,必须配置。 -->
            <external-files-path
                name="images"
                path="Pictures" />
        </paths>
    </resources>
    

    如果想把图片放在手机的共享储存区,比如Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)文件夹下,还需要申请文件读写权限。

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    

    文件读写权限同样需要动态申请,申请权限的方式跟上面申请相机权限一样,这里就不再重复了。

    最后

    如果你看到了这里,觉得文章写得不错就给个赞呗!欢迎大家评论讨论!如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足,定期免费分享技术干货。谢谢!

    展开全文
  • Android8.0以上得加channelId Intent intent = new Intent(SplashActivity.this,ChatActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0); ...

     Android8.0以上得加channelId

    Intent intent = new Intent(SplashActivity.this,ChatActivity.class);
                    PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
                    Notification notification;
                    Notification.Builder builder;
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        builder=new Notification.Builder(this,"5996773");
                    }else {
                        builder=new Notification.Builder(this);
                    }
                    //设置标题
                    builder.setContentTitle("设置标题");
                    //设置内容
                    builder.setContentText("内容是............");
                    //设置状态栏显示的图标,建议图标颜色透明
                    builder.setSmallIcon(R.mipmap.ic_launcher);
                    // 设置通知灯光(LIGHTS)、铃声(SOUND)、震动(VIBRATE)、(ALL 表示都设置)
                    builder.setDefaults(Notification.DEFAULT_ALL);
                    //灯光三个参数,颜色(argb)、亮时间(毫秒)、暗时间(毫秒),灯光与设备有关
                    builder.setLights(Color.RED, 200, 200);
                    // 铃声,传入铃声的 Uri(可以本地或网上)我这没有铃声就不传了
                    builder.setSound(Uri.parse("")) ;
                    // 震动,传入一个 long 型数组,表示 停、震、停、震 ... (毫秒)
                    builder.setVibrate(new long[]{0, 200, 200, 200, 200, 200});
                    // 通知栏点击后自动消失
                    builder.setAutoCancel(true);
                    // 简单通知栏设置 Intent
                    builder.setContentIntent(pendingIntent);
                    builder.setPriority(Notification.PRIORITY_HIGH);
    
                    //设置下拉之后显示的图片
                    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon));
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        NotificationChannel channel = new NotificationChannel("5996773", "安卓10a", NotificationManager.IMPORTANCE_DEFAULT);
                        channel.enableLights(true);//是否在桌面icon右上角展示小红点
                        channel.setLightColor(Color.GREEN);//小红点颜色
                        channel.setShowBadge(false); //是否在久按桌面图标时显示此渠道的通知
                        mNManager.createNotificationChannel(channel);
                    }
                    notification=builder.build();
                    mNManager.notify(1,notification);

     

    展开全文
  • 安卓Q中google彻底禁止了第三发应用获取imei,并且mac地址返回的地址也变成了02:00:00:00:00:00。 这是官方给出的解决方案: https://developer.android.com/training/articles/user-data-ids 这是官网的截图: ...

    安卓Q中google彻底禁止了第三发应用获取imei,并且mac地址返回的地址也变成了02:00:00:00:00:00。

    这是官方给出的解决方案:

    https://developer.android.com/training/articles/user-data-ids

    这是官网的截图:

     

    方法一:

    既然这两个都没法获取了,所以想到获取ANDROID_ID:

        public static String getAndroidId (Context context) {
            String ANDROID_ID = Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);
            return ANDROID_ID;
        }
    

    但是发现不同应用的正式包在相同设备上得到的ANDROID_ID结果不同,因此显然该方案不可行。

    方法二:

    按照google官方意见,是在安装应用时,生成UUID,保存到本地,如果本地已经存在UUID,则不在保存,这样就可以将UUID作为唯一标识符。下面是官方推荐截图:

     

    好的,那么就使用UUID:

    String uuidStr = UUID.randomUUID().toString();

    将UUID以文件的形式保存在多媒体文件目录下,这样一来各个不同的应用间都能采用同一个UUID。生成UUID。其中 saveFileName 为存放uuid数据的文件名:

    
        /**
         * 在媒体文件中 生成fileName文件
         * 向Mediastore添加内容
         *
         * @param saveFileName 保存文件的名称
         */
        private void creatUUIDFile(String saveFileName) {
            ContentValues values = new ContentValues();
            values.put(MediaStore.Images.Media.DISPLAY_NAME, saveFileName);
            values.put(MediaStore.Images.Media.MIME_TYPE, "image/*");
            // TODO: 2019-10-11 IS_PENDING = 1表示对应的item还没准备好
            values.put(MediaStore.Images.Media.IS_PENDING, 1);
    
            ContentResolver resolver = this.getContentResolver();
            Uri collection = MediaStore.Images.Media.getContentUri(MediaStore.VOLUME_EXTERNAL_PRIMARY);
    
            Uri uri = resolver.insert(collection, values);
    
            try {
                //访问 对于单个媒体文件,请使用 openFileDescriptor()。
                ParcelFileDescriptor fielDescriptor = resolver.openFileDescriptor(uri, "w", null);
                FileOutputStream outputStream = new FileOutputStream(fielDescriptor.getFileDescriptor());
                try {
                    //讲UUID写入到文件中
                    String uuidStr = UUID.randomUUID().toString();
                    outputStream.write(uuidStr.getBytes());
                    outputStream.close();
                    Log.d(TAG, "写入 uuidStr:" + uuidStr);
                } catch (IOException e) {
                    e.printStackTrace();
                }
                values.clear();
                values.put(MediaStore.Images.Media.IS_PENDING, 0);          //设置为0
                resolver.update(uri, values, null, null);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

    如果需要判断是否已经存在存放uuid的文件,则用下面的方法:

        /**
         * 检查文件是否存在
         *
         * @param saveFileName 保存文件的名称
         * @return true 为存在   false为不存在
         */
        private boolean checkUUIDFileByUri(String saveFileName) {
            Uri mImageUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
            String[] projection = {
                    MediaStore.Images.Media.DISPLAY_NAME,
                    MediaStore.Images.Media._ID
            };
            //查询
            ContentResolver contentResolver = this.getContentResolver();
    
            // 添加筛选条件
            String selection = MediaStore.Images.Media.DISPLAY_NAME + "=" + "'" + saveFileName + "'";
            Cursor mCursor = contentResolver.query(mImageUri, projection, selection, null, null);
    
            String getSaveContent = "";
            if (mCursor != null) {
                while (mCursor.moveToNext()) {
    
                    int fileIdIndex = mCursor.getColumnIndex(MediaStore.Images.Media._ID);
                    String thumbPath = MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon()
                            .appendPath(String.valueOf(mCursor.getInt(fileIdIndex))).build().toString();
                    Uri fileUri = Uri.parse(thumbPath);
                    try {
                        ParcelFileDescriptor fielDescriptor = contentResolver.openFileDescriptor(fileUri, "r", null);
                        FileInputStream inputStream = new FileInputStream(fielDescriptor.getFileDescriptor());
                        getSaveContent = inputStreamToString(inputStream);
    
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
    
                    //只有在得到的唯一标识符不为空的情况下才结束循环,否则一直循环
                    if (!TextUtils.isEmpty(getSaveContent)) {
                        break;
                    }
                }
                mCursor.close();
    
            }
    
            return !getSaveContent.equals("");
        }

     

    上面代码中的inputStreamToString()方法为流转字符串,代码如下:

        /**
         * 流转为字符串
         *
         * @param is 流
         * @return 转换完成的字符串
         */
        public String inputStreamToString(InputStream is) {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
    
            String line;
            try {
                while ((line = reader.readLine()) != null) {
                    sb.append(line).append("/n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return sb.toString();
        }
    

    好的,先这样。

    展开全文
  • 台式机没有摄像头,做笔试题目又需要摄像头,懒得把笔记本带过来,就想找找有没有这种方法,网上的不知道为什么,都是五六年前的链接,都不支持安卓8.0和Win10。自己找到一个,分享一下。 PC版和安卓版软件官网地址...
  • kali linux入侵安卓手机

    万次阅读 多人点赞 2019-02-18 21:43:16
    kali入侵安卓手机的方法和其他的博主方法一样,只是开头对手机的ip进行设置 首先,我用的靶机是魅蓝2,对其网络使用静态ip:xxx.xxx.xxx.aaa,“x”是需要对应入侵机的ip,“a”则是没用过的0-255随便输 msfvenom...
  • 附ADT安装网址:...[文章来源:维基百科 - 安卓版本历史,链接:https://en.wikipedia.org/wiki/Android_version_history] Code name Version number Linux kernel...
  • kali通过无线渗透入侵安卓手机

    万次阅读 多人点赞 2020-01-17 15:43:39
    前言 我们经常在公共场所连上当地的wifi网络,享受高速冲浪的同时是否注意到隐私安全呢?假如黑客架设了一个恶意的wifi...这次做一个无线局域网内的渗透安卓手机的测试,学习使用metasploit framewor主流下的msfv...
  • Android Studio 3.0  Unity 5.6.4p4 WIN 7 64 位 Android Studio 3.0 需要 JDK 安装包 为 Java SE Development Kit 8u151 如果没有 安装正确。 Android Studio 3.0 会 有个提示 ,里面有个链接。点击 就可以...
  • 网上的教程皮的简直不谈了,非要搞个AndroidStdio,你以为呢?反手就是一重锤,我就是不装,第一开发的很多工作都不需要这个IDE,第二运行起来还很吃内存,经过实践有如下的教程,请大家指教。 安装 git 不说了,我...
  • Android开发过程中,经常会遇到日期的各种格式转换,主要使用SimpleDateFormat这个类来实现,掌握了这个类,可以转换任何你想要的各种格式。 常见的日期格式: 1,日期格式:String dateString = "2017-06-...
  • android源码程序:安卓闹钟

    热门讨论 2013-05-28 17:01:23
    杨凯专属频道坚持免费资源共享原则:DeskClockApp-4-10(安卓闹钟),亲情奉献源码
  • 下面说一下我自己在win10搭建环境的过程: 先普及一下appium的工作原理,不然大家很难理解环境为什么这么搭建,以及为什么需要这些工具: 首先Appium是一个开源、跨平台的测试框架,可以用来测试原生及混合的...
  • AndroidUSBCamera基于[saki4510t/UVCCamera](https://github.com/saki4510t/UVCCamera)开发,该项目对USB Camera(UVC设备)的使用和视频数据采集进行了高度封装,能够帮助开发者通过几个简单的API实现USB Camera设备...
  • 最近需要将深度学习模型移植到安卓手机上,故安装了一个安卓的开发环境,查找了一些资料,最终安装成功,并跑成功“hello world”的demo,特此记录。 详细安装步骤1.安装JDK2.配置环境3.安装Android studio4.首次...
  • 安卓巴士Android开发神贴整理

    千次阅读 2012-02-26 16:29:19
    10个经典的Android开源应用项目 http://www.apkbus.com/android-13519-1-1.html 安卓巴士总结了近百个Android优秀开源项目,覆盖Android开发的每个领域 http://www.apkbus.com/android-17627-1-1.html ...
  • 公司电脑很渣了,As的自带虚拟机各种问题,然后被北京的老同学推了微软的Visual Studio Emulator for Android 虚拟机给我,速度真是很快哦~ 首先这个虚拟机非常依赖Hyper-V,我的电脑windows10家庭版...家庭版...
  • Android多语言切换(兼容安卓9、10

    千次阅读 2020-05-19 16:40:26
    前言:Android应用的开发不可能仅仅针对某一个国家或者区域使用,因此APP必须支持多种语言,为了实现这个特性,Android给出了一个解决方案,在res文件夹下通过values+语言编码来实现多国语言的支持(中间採用连字...
  • Android studio 3.5 运行AVD出现 10:12 Emulator: ERROR: Unable to access 'C:\Users\璋捣灞盶.emulator_console_auth_token': emulator console will not work 10:12 Gradle build finished in 10 s 159 ms 10...
  • 安卓手机不root使用xpose-修改手机位置,Tiktok使用 标签: 安卓 xpose 免root安装xpose xpose是安卓手机中很厉害的一个app,利用它可以实现手机的各种diy,但是由于xpose需要root,并且可能会造成系统的略微不稳定...
  • 本教程帮助大家如何使小米5刷机成安卓Q(安卓10),刷机有风险,小白需谨慎。 准备工作 第一步:首先要保证手机为最新的开发版MIUI系统(截止到2020/2/17号,MIUI版本号为MIUI10 8.11.22) 第二步:确保手机已经解锁...
  • 原来在做公司的产品的时候有做一个数字小键盘的要求,那么刚好也上网查找这些方法,对比之后,发现用Set的数组是最高效的一种叫。 下面介绍其方法。 Set setRan = new HashSet();... while (set.size() 10) {
  • Android 10 适配攻略

    万次阅读 多人点赞 2020-02-26 11:20:52
    相比较去年的写的Android 9适配,这次Android 10的内容有点多。没想到写了我整整两天,吐血中。。。
  • Kali Linux-Metasploit入侵Android手机

    万次阅读 多人点赞 2019-08-09 22:37:07
    kali Linux-Metasploit入侵Android手机 写此文章的初衷是为了告诉哪些喜欢蹭别人wifi的人,这样的做法是很危险的哦! Kali Linux IP地址192.168.1.101(虚拟机设置桥接模式) 同一局域网内安卓手机一部 创建一个...
  • 今天android studio3.6.1版本连接华为 手机一直连接不上 解决办法: (开发者模式,在设置,--关于手机---连续点击版本号就会出现开发者模式) 手机设置--系统和更新---开发人员选项---打开开发者模式和usb调试。 ...
  • Android 安卓开发入门教程,

    千次阅读 2016-07-07 11:03:24
    梦想绘图控件开发教程 V6.0版 1 1、 环境搭建: 3 1.1、 下载Android SDK 3 1.2、 下载 eclipse 5 1.3、 下载JDK6 5 ...运行Eclipse设置Android ADT插件 10 1.6、 NDK安装 12 1.7、 python2.7.3 14
  • 下载地址:...http://tools.android-studio.org/index.php 下载完毕,点击安装。 下载eclipse: https://www.eclipse.org/downloads/download.p
  • 1、问题Intent intent = new Intent("...boolean result = bindService(intent, mKeyServiceConnection, Context.BIND_AUTO_CREATE)result结果是false, android 8.0绑定服务失败2、解决办...
  • 首先要强调的是命令行工具使用起来虽然比较方便,但是对使用者有一定要求。...如果准备使用命令行工具进行转换,需要去BlackBerry管网上下载命令行工具,下载地址如下:https://bdsc.webapps.blackberry.com/android/
  • Android Studio 3.0  Unity 5.6.4p4 WIN 7 64 位 Android Studio 3.0 需要 JDK 安装包 为 Java SE Development Kit 8u151 在Android Studio 下载页面 找到 Android Studio 3.0 ...

空空如也

1 2 3 4 5 ... 20
收藏数 200,914
精华内容 80,365
关键字:

android10