Unity3D-Android调用系统分享针对8.0系统的方式

我在原来的帖子上写了一个关于Android原生分享的方法:

http://blog.csdn.net/pz789as/article/details/77979594

但是,在后面测试的时候发现,这个方式在Android 8.0 上不起作用,点了按钮之后,并没有弹出原生分享框。

网上大部分的原生分享代码都和我上面写的一样,所以只能自己看文档,慢慢再试其他的,最后经过努力,终于给弄出来了,还兼容低版本的Android。

问题的关键就是在图片的加载处理上了,原来的图片只能随意保存在自己的目录中,就可以加载分享,但是8.0之后,好像加强了管理,于是参考文档修改了下加载图片的方式之后,就可以弹出分享框了,代码如下:

private IEnumerator TakeScreenshotAndroid()
	{
		Cuting.SetRaycast(true);
		if (cutObjects != null){
			for(int i=0;i<cutObjects.Length;i++){
				cutObjects[i].GetComponent<CanvasGroup>().alpha = 0;
				CanvasGroup cg = cutObjects[i].GetComponent<CanvasGroup>();
				cg.alpha = 0;
			}
		}
		CookieShop.HideAdsBanner();
        yield return new WaitForEndOfFrame();
		var width = Screen.width;
		var height = Screen.height;
		var tex = new Texture2D(width, height, TextureFormat.RGB24, false);
		tex.ReadPixels(new Rect(0, 0, width, height), 0, 0);
		tex.Apply();
		if (height / 4 < 300){
			CompressPNG(tex, 2);
		}else{
			CompressPNG(tex, 4);
		}
		GJCPngEncoder encoder = new GJCPngEncoder(tex, 80);
		encoder.doEncoding();
		while(!encoder.isDone){
			yield return null;
		}
        string destination = Path.Combine(Application.persistentDataPath, "shareAndroid001.png");
		File.WriteAllBytes(destination, encoder.GetBytes());
        yield return new WaitForSeconds(0.3f);
		if (cutObjects != null){
			for(int i=0;i<cutObjects.Length;i++){
				cutObjects[i].GetComponent<CanvasGroup>().alpha = 1;
			}
		}
		CookieGame.ins.ShowAdsBanner();
		
        if (!Application.isEditor)
        {
            // AndroidJavaClass intentClass = new AndroidJavaClass("android.content.Intent");
            // AndroidJavaObject intentObject = new AndroidJavaObject("android.content.Intent");
            // intentObject.Call<AndroidJavaObject>("setAction", intentClass.GetStatic<string>("ACTION_SEND"));
            // AndroidJavaClass uriClass = new AndroidJavaClass("android.net.Uri");
            // AndroidJavaObject uriObject = uriClass.CallStatic<AndroidJavaObject>("parse", "file://" + destination);
            // intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_STREAM"), uriObject);
            // intentObject.Call<AndroidJavaObject>("putExtra", intentClass.GetStatic<string>("EXTRA_TEXT"), shareDefaultText);
            // intentObject.Call<AndroidJavaObject>("setType", "image/jpeg");
            // AndroidJavaClass unity = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            // AndroidJavaObject currentActivity = unity.GetStatic<AndroidJavaObject>("currentActivity");
            // AndroidJavaObject chooser = intentClass.CallStatic<AndroidJavaObject>("createChooser", intentObject, "Share");
            // currentActivity.Call("startActivity", chooser);

			WWW www = new WWW("file://" + destination);
			while(!www.isDone){
				yield return null;
			}
			Texture2D picture = www.texture;
			byte[] bytes = new AndroidJavaObject("android.util.Base64").CallStatic<byte[]>("decode",System.Convert.ToBase64String (picture.EncodeToPNG()),0);
			AndroidJavaObject bitmap =  new AndroidJavaObject("android.graphics.BitmapFactory").CallStatic<AndroidJavaObject>("decodeByteArray",bytes,0,bytes.Length);
			AndroidJavaObject compress = new AndroidJavaClass("android.graphics.Bitmap$CompressFormat").GetStatic<AndroidJavaObject>("JPEG");
			bitmap.Call<bool>("compress",compress,100,new AndroidJavaObject("java.io.ByteArrayOutputStream"));
			string path = new AndroidJavaClass("android.provider.MediaStore$Images$Media").CallStatic<string>("insertImage",currentActivity.Call<AndroidJavaObject>("getContentResolver"),bitmap,picture.name,"");
			AndroidJavaObject uri = new AndroidJavaClass("android.net.Uri").CallStatic<AndroidJavaObject>("parse",path);
			AndroidJavaObject sharingIntent  = new AndroidJavaObject("android.content.Intent");
			sharingIntent.Call<AndroidJavaObject>("setAction","android.intent.action.SEND");
			sharingIntent.Call<AndroidJavaObject>("setType","image/*");
			sharingIntent.Call<AndroidJavaObject>("putExtra","android.intent.extra.STREAM",uri);
			sharingIntent.Call<AndroidJavaObject>("putExtra","android.intent.extra.TEXT",shareDefaultText);
			// sharingIntent.Call<AndroidJavaObject>("putExtra","android.intent.extra.SUBJECT","Share to");
			AndroidJavaObject createChooser = sharingIntent.CallStatic<AndroidJavaObject>("createChooser",sharingIntent, "Share to");
			currentActivity.Call("startActivity",createChooser);
            yield return new WaitForSeconds(1f);
        }
        yield return new WaitUntil(() => isFocus);
        Cuting.SetRaycast(false);
		Waiting.SetWaiting(true);
		Destroy(tex);
		OnShareSuccess("Android share");
	}
	private static AndroidJavaObject currentActivity{
		get{ 
			return new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity");
		}
	}



上面注释的部分是以前的写法,在下面的是新写法。

效果图没有重新截取了,用原来的表示下就好了。。



猜你喜欢

转载自blog.csdn.net/pz789as/article/details/79411133