unity3d 访问手机相册设置头像

Android端

public void SelectPhoto()
   {


       //Intent就是应用之间,应用不同Activity之间交互。
       Intent getAlbum = new Intent(Intent.ACTION_GET_CONTENT);  //新建Intent,让用户选择特定类型的数据,并返回该数据的URI.


       getAlbum.setType("image/*");  //类型为图片


       startActivityForResult(getAlbum, 108); //调用相册,结果码108,如果有结果会返回108,这个值随便设置,只要>=0就行
   }




   //重写Activity里的onActivityResult方法,这个方法和startActivityForResult是一对出现。
   @Override
   protected void onActivityResult(int requestCode, int resultCode, Intent intent) {


       // 用户没有进行有效的设置操作,返回系统固定的常量RESULT_CANCELED=0
       if (resultCode == RESULT_CANCELED) {
           Toast.makeText(getApplication(), "没有选择图片", Toast.LENGTH_LONG).show();
           return;
       }


       switch (requestCode) {
           case 108:
               Toast.makeText(getApplication(), "图片挑选完成", Toast.LENGTH_LONG).show();
               //裁剪图片
               CropPhoto(intent.getData());//获取资源的Uri,安卓Uri通用资源标识符,表示一个图片或视频
               break;
           case 109:
               Toast.makeText(getApplication(), "图片裁剪完成", Toast.LENGTH_LONG).show();
               //保存图片
               //可能抛出异常方法IOException方法必须用Try
               try {
                   SaveImage(intent);
               }
               catch (IOException e) {
                   e.printStackTrace();
               }
               break;
       }
       super.onActivityResult(requestCode, resultCode, intent);
   }


   //裁剪图片
   public void CropPhoto(Uri uri) {
       //调用裁剪器
       Intent intent = new Intent("com.android.camera.action.CROP");
       intent.setDataAndType(uri, "image/*");
       // 开启裁剪功能
       intent.putExtra("crop", "true");
       //设置宽高的比例
       intent.putExtra("aspectX", 1);
       intent.putExtra("aspectY", 1);
       //裁剪图片宽高
       intent.putExtra("outputX", 100);
       intent.putExtra("outputY", 100);
       //请求返回数据
       intent.putExtra("return-data", true);


       startActivityForResult(intent, 109);  //结果码109
   }




    //保存裁剪图片供U3D读取 使用 FileOutputStream 必须要捕获和处理错误 抛出异常IOException
   private void SaveImage(Intent intent) throws IOException {
       //获取intent传过来的数据
       //Bundle类是键值对形式,传递数据  Intent也可以传递数据,两个区别:intent是Bundle的封装
       //Intent主要数据传递用,bundle主要存取数据用。
       Bundle extras = intent.getExtras();


       if (extras != null) {
           //取出数据
           Bitmap bitmap = extras.getParcelable("data");


           //文件路径=U3D里的Application.persistentDataPath路径
           File destDir = new File("/mnt/sdcard/Android/data/com.zou.chongyang/files");
           //如果没有这个目录,创建一个
           if(!destDir.exists())
           {
               destDir.mkdirs();
           }
           //创建图片数据输出流
           FileOutputStream bitmapOut = new FileOutputStream("/mnt/sdcard/Android/data/com.zou.chongyang/files/headImage.png");
           //压缩图片 参数1:图片格式    参数2:压缩率100表示不压缩   参数3:写入输出流
           bitmap.compress(Bitmap.CompressFormat.PNG, 100, bitmapOut);
           //讲输出流刷新写出到磁盘
           bitmapOut.flush();
           //关闭流
           bitmapOut.close();


           //通知U3D可以读取图片了  参数1:U3D物体名称   参数2:方法名   参数3:要传递的参数,这里传图片名称
           UnityPlayer.UnitySendMessage("headImage","AndroidSaveHeadImageOver","headImage.png");


       }
   }


unity3d 端


  public void OnSelectPhoto()
    {
        AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");   //获取unity的Java类,只能调用静态方法,获取静态属性
        AndroidJavaObject jo = jc.GetStatic("currentActivity");      //获取当前的Activity对象,能调用公开方法和公开属性      
        //一开始就调用安卓选择图片
        jo.Call("SelectPhoto"); 
    
    }

Android读取照片后,传递给unity3d里面的方法,显示照片

void AndroidSaveHeadImageOver(string str)
    {
       
        StartCoroutine(LoadTexture(str));


    }
    //从安卓中读取贴图
    IEnumerator LoadTexture(string name)
    {
    
        string path = "file://" + Application.persistentDataPath + "/" + name;


        WWW www = new WWW(path);
        while (!www.isDone)
        {
            //没有完成什么都不做,等待
        }
        yield return www;
        //显示贴图
        GetComponent().texture = www.texture;
    }

你可能感兴趣的:(unity3d 访问手机相册设置头像)