将数据发送给微信

var dbFile = Path.Combine(DBSetting.GetSetting().DBDirectory, $"{BLL.SelectProject.DBName}.db");
var sharefile = new Xamarin.Essentials.ShareFile(dbFile)
{
ContentType = "application/db"
};
await Share.RequestAsync(new ShareFileRequest
{
Title = $"分享项目文件{BLL.SelectProject.DBName}.db",
File = sharefile
});

接收微信分享的文件

在MainActivity.cs中

    //参考:https://blog.csdn.net/j5856004/article/details/102651886
//参考:https://www.jianshu.com/p/2f2ffb6ec4bb
//必须要单独写这个IntentFilter,否则桌面就没有图标了!!!!!重点中的重点
[IntentFilter(new[] { Intent.ActionMain }, Categories = new[] { Intent.CategoryLauncher })]
[IntentFilter(
new[] { Intent.ActionView, Intent.ActionSend },// Intent.ActionView ,确保微信点击【使用第三方应用打开】时可以看到图标
Categories = new[] { Intent.CategoryDefault },
/*DataScheme = "file",*/ //如果QQ也要打开,这里要设置file
//DataMimeType确保特定的文件,可以使用此APP打开
/*DataMimeType = "application/octet-stream"*/ //设置了application/octet-stream,就可以接.db.octet-stream文件
DataMimeType = "text/comma-separated-values" //*/*表示接收所有文件
)]
//以下这个IntentFilter,能确保其他APP,接收到文件后,进行分享时,能看到这个APP的图标!!!!,非常重要!!

  [IntentFilter(
    new[] { Intent.ActionView, Intent.ActionSend },
    Categories = new[] { Intent.CategoryDefault },
    DataScheme = "file",   
    DataMimeType = "*/*"  
    )]

    //这个是项目默认的,不用改
[Activity(Label = "FmosMobile", Icon = "@mipmap/fmos", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{ }

在MainActivity的OnResume方法重写中,加入:

   protected override void OnResume()
{
base.OnResume();
this.SaveFile(Intent);
} public static PYLMath.CommonExecuteResult<string> SaveFile(this Activity content, Intent Intent)
{
var res = new PYLMath.CommonExecuteResult<string>();
//使用微信第三方应用打开文件时
var extras = Intent.Extras;
if (extras == null)
{
res.IsSuccess = false;
return res;
}
string tempPath;
try
{
tempPath = System.IO.Path.Combine(System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal), "temp");
if (!System.IO.Directory.Exists(tempPath))
{
System.IO.Directory.CreateDirectory(tempPath);
}
}
catch (Exception ex)
{
res.InnerException = ex;
return res;
}
//
string action = Intent.Action; //如果从微信中点击【使用第三方应用打开】,就是ActionView
//如果微信分享的是*.db,那么 "application/db" ;如果是*.db..octet-stream,那么就application/octet-stream
string type = Intent.Type;
var uri = Intent.Data;
int readCount = 0;
char[] buffer = null;
//创建一个请求
try
{
//参考:https://segmentfault.com/a/1190000021357383,关键是这几行!!!!!!
ParcelFileDescriptor parcelFileDescriptor = content.ContentResolver.OpenFileDescriptor(Intent.Data, "r");
var reader = new Java.IO.FileReader(parcelFileDescriptor.FileDescriptor);
var size = parcelFileDescriptor.StatSize;
if (reader.Ready() == false)
{
return res;
}
buffer = new char[size];
readCount = reader.Read(buffer, 0, (int)size);
//
parcelFileDescriptor.Close();
reader.Close();
}
catch (Java.IO.FileNotFoundException e)
{
res.InnerException = e;
res.IsSuccess = false;
return res;
}
catch (Exception ex)
{
res.InnerException = ex;
res.IsSuccess = false;
return res;
}
//
if (readCount <= 0)
{
return res;
}
byte[] bytes = new byte[readCount];
for (int i = 0; i < readCount; i++)
{
bytes[i] = (byte)buffer[i];
}
try
{
//
var fileName = System.IO.Path.GetFileName(Nancy.Helpers.HttpUtility.UrlDecode(Intent.DataString, System.Text.Encoding.UTF8));
var saveFile = System.IO.Path.Combine(tempPath, fileName);
System.IO.File.WriteAllBytes(saveFile, bytes);
//
res.Content = saveFile;
res.IsSuccess = true;
return res;
}
catch (Exception ex)
{
res.InnerException = ex;
return res;
}
}

打包的一些注意事项

一、去掉钩

二、存档

重点:这个一定要保存好,所谓【证书/签名/密钥】等等,就是这个东西。

如果每次不是用同一个【证书】,那么,在更新的时候,就会出现”证书不一致“,导致应用必须要卸载才能更新,最终后果就是,APP本地数据全部丢失!!!!

还有,com.xxxxx.xxx.apk,中间的xxxxx.xxx一定要写好,在项目属性那里设置,一旦发布了被客户使用了,就没得后悔了,不然又得卸了重装,不能通过升级解决!!!

保存为APK

其他小坑:

一、

切换成release才可以分发

二、为了避免安装的时候,手机显示没有证书,最好给客户这个apk。(反正我试过没有什么问题,包括安装、升级啥的,或许不这样也行)

三、不要乱升级Xamarin.Form,默认是5.0.0.2012版,否则会出现javac.exe错误,无解!!!!

四、遇到调试时闪退,不报任何错误,不要打勾

五、请在运行应用程序之前选择有效的设备 。

(一)重装ADB:Win10 配置安装ADB教程总结20200514 - 知乎 (zhihu.com)

六、XABLD7000: Xamarin.Tools.Zip.ZipException: Renaming temporary file failed: Permission denied

(一)切换成release模式

(二)不要打勾

(三)重新生成、部署

(四)切换回DEBUG模式

七:使用Jar包:绑定 .JAR - Xamarin | Microsoft Docs

八:使用aar包:用解压工具加压后,得到jar包

九:一些很难用的jar包,使用VsCode,再用java包装一下导出jar包用。

不用选中间那个

导出的问题:xamarin Unsupported class file major version 61

解决方案:修改编译使用的JDK版本

原本是17的,改成11。

十:出现GSON错误,在管理NUGET包中,添加GoogleGson包。

远程调试 

在安装了ADB.exe的情况下,连上USB线

调试的时候,选择

使用ADB安装apk包。(注意只能连一台设备)

Xamarin.Android 踩坑记的更多相关文章

  1. 【踩坑记】从HybridApp到ReactNative

    前言 随着移动互联网的兴起,Webapp开始大行其道.大概在15年下半年的时候我接触到了HybridApp.因为当时还没毕业嘛,所以并不清楚自己未来的方向,所以就投入了HybridApp的怀抱. Hy ...

  2. Spark踩坑记——Spark Streaming+Kafka

    [TOC] 前言 在WeTest舆情项目中,需要对每天千万级的游戏评论信息进行词频统计,在生产者一端,我们将数据按照每天的拉取时间存入了Kafka当中,而在消费者一端,我们利用了spark strea ...

  3. Spark踩坑记——数据库(Hbase+Mysql)

    [TOC] 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库,去统计或者改变一些值.最近一个实时消费者处理任务,在使用spark streami ...

  4. Spark踩坑记——共享变量

    [TOC] 前言 Spark踩坑记--初试 Spark踩坑记--数据库(Hbase+Mysql) Spark踩坑记--Spark Streaming+kafka应用及调优 在前面总结的几篇spark踩 ...

  5. Spark踩坑记——从RDD看集群调度

    [TOC] 前言 在Spark的使用中,性能的调优配置过程中,查阅了很多资料,之前自己总结过两篇小博文Spark踩坑记--初试和Spark踩坑记--数据库(Hbase+Mysql),第一篇概况的归纳了 ...

  6. djangorestframework+vue-cli+axios,为axios添加token作为headers踩坑记

    情况是这样的,项目用的restful规范,后端用的django+djangorestframework,前端用的vue-cli框架+webpack,前端与后端交互用的axios,然后再用户登录之后,a ...

  7. HttpWebRequest 改为 HttpClient 踩坑记-请求头设置

    HttpWebRequest 改为 HttpClient 踩坑记-请求头设置 Intro 这两天改了一个项目,原来的项目是.net framework 项目,里面处理 HTTP 请求使用的是 WebR ...

  8. vue踩坑记

    vue踩坑记 易错点 语法好难啊qwq 不要把'data'写成'date' 在v-html/v-bind中使用vue变量时不需要加变量名 在非vue事件中使用vue中变量时需要加变量名 正确 < ...

  9. 【bug记录】OS Lab4 踩坑记

    OS Lab4 踩坑记 Lab4在之前Lab3的基础上,增加了系统调用,难度增加了很多.而且加上注释不详细,开玩笑的指导书,自己做起来困难较大.也遇到了大大小小的bug,调试了一整天. 本文记录笔者在 ...

  10. 【bug记录】OS Lab3 踩坑记

    OS Lab3 踩坑记 Lab3在之前Lab2的基础上,增加了进程建立.调度和中断异常处理.其中测试包括进程建立以及进程调度部分. 由于是第一次做bug记录,而且是调试完bug后再做的记录,所以导致记 ...

随机推荐

  1. C++ cannot bind non-const lvalue reference of type ‘Dog&’ to an rvalue of type ‘Dog’

    void function(Dog & d){ /************** } 调用这个函数,如果传参一个右值对象,临时对象,则会出现这个问题 一个临时对象的引用,这怎么想都不合理 从该函 ...

  2. Android获取获取悬浮窗一下的view办法

    getwindows可以获取当前手机屏幕所有有交互功能的view getactitywindows只能获取最顶层有交互的view

  3. 把逗号分隔的String字符串转List<Integer>

    把逗号分隔的String字符串转int集合 集合或数组转变为逗号分隔的字符串的几种方式 1.自己编码实现 2.org.apache.commons.lang3.StringUtils 3.String ...

  4. JDBC:实现Java与数据库的连接

    先了解重要的编程思想:ORM(object relational mapping) 即将数据库与JAVA的类一一映射(对应) 一个数据表对应一个Java类 表中的一条记录对应Java类的一个对象 表中 ...

  5. vue2的反向代理

    // 在vue.config.js中的配置项配置 devServer: { proxy: { // 当我们的本地的请求 有/api的时候,就会代理我们的请求地址向另外一个服务器发出请求 '/api': ...

  6. vim自动输入P的问题

    最近新租的centos8云服务器默认用的vim8.0,发现一个bug,就是每次打开文件,自动输入了一个P,原来是8.0的一个bug,升级版本可以解决 参考https://www.jianshu.com ...

  7. NRF52832中文资料+蓝牙芯片

    [产品应用] Nordic Semiconductor发布采用微型封装尺寸的高性能单芯片低功耗蓝牙SoC器件,瞄准新一代可穿戴产品和空间受限的loT应用.[产品说明]nRF52832晶圆级芯片尺寸封装 ...

  8. java.lang.UnsatisfiedLinkError:【Linux运行JAVA调用JNA重新,so,SO报错】

    困扰了好半天,我自己新建的项目,包名什么的不一样,太TM坑了,必须要包名一样文件名一样

  9. git如何把本地文件夹和远程仓库关联

    场景: 1,有一个本地项目,没有上传到git过,你在远程新建了一个仓库,想把这个本地的代码推送到该仓库 2,直接想把本地代码推送到远程并创建该本地文件对应的仓库(这种情况不可以实现) 解决方法: 本地 ...

  10. 数位dp( tzoj6061:Bomb-求49个数;tzoj1427: 不要62)

    6061:http://www.tzcoder.cn/acmhome/problemdetail.do?method=showdetail&id=6061 dfs记忆化搜索 #include& ...