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

本文介绍了一种在Android 8.0及以上版本中实现原生分享的方法,解决了传统分享方式失效的问题,并提供了兼容低版本Android的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

http://blog.youkuaiyun.com/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");
		}
	}



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

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



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏小败在路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值