我在原来的帖子上写了一个关于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");
}
}
上面注释的部分是以前的写法,在下面的是新写法。
效果图没有重新截取了,用原来的表示下就好了。。