当前位置:首页 > 代码 > 正文

android自定义分享页面代码下载(Android分享文件)

admin 发布:2022-12-19 04:37 105


今天给各位分享android自定义分享页面代码下载的知识,其中也会对Android分享文件进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

利用 Android 系统原生 API 实现分享功能(2)

在之前的一篇文章 利用 Android 系统原生 API 实现分享功能 中主要说了下实现流程,但具体实施起来其实还是有许多坑要面对。那这篇文章就是提供一个封装好的 Share2 库供大家参考。

GitHub 项目地址:Share2

看过上一篇文章的同学应该知道,要调用 Android 系统内建的分享功能,主要有三步流程:

更多相关内容请参考上一篇,这里就不再重复赘述了。

知道大致的实现流程后,其实只要解决下面几个问题后就可以具体实施了。

这其实是直接决定了最终的实现形态,我们知道常见的使用场景中,只是为了在应用间分享图片和一些文件,那对于那些只是分享文本的产品而言,两者实现起来要考虑的问题完全不同。

所以为了解决这个问题,我们可以预先定好支持的分享内容类型,针对不同类型可以进行不同的处理。

在 Share2 中,一共定义了5种类别的分享内容,基本能覆盖常见的使用场景。在调用分享接口时可以直接指定内容类型,比如像文本、图片、音视频、已经其他各种类型文件。

对于不同类别的内容,可能会有不同的来源。比如文本可能就只是一个字符串对象,而对于分享图片或其他文件,我们需要一个 Uri 来标识一个资源。这其实就引出来具体实施时的一个大问题,如何获取要分享文件的 Uri,并且这个 Uri 要能被接收分享内容的应用处理才行 。

那么,如何获取要分享内容文件的 Uri?如果处理才能让接收方也能够根据 Uri 获取到文件?

我们把文件 Uri 的来源划分为下面三种类型:

常见场景 :通过文件选择器获取一个文件的 Uri

通过这种方式获取到的 Uri 是由系统 ContentProvider 返回的,在 Android 4.4 之前的版本和之后的版本有较大的区别,我们后面再说怎么处理。只要先记住这种系统返回给我们的 Uri 就行了。

比如调用系统相机进行拍照或录制音视频,要传入一个生成目标文件的 Uri ,从 7.0 开始我们需要用到 FileProvider 来实现。

如果用到了 FileProvider 就要注意跟系统 ContentProvider 返回 Uri 的区别,比如我们在 Manifest 中对 FileProvider 配置 android:authorities="com.xx.xxx.fileProvider" 属性,那这时系统返回的 Uri 格式就变成了 : content://com.xx.xxx.fileProvider... ,对于这种类型的 Uri 我们姑且叫 自定义 FileProvider 返回的 Uri ,后面一并说怎么处理。

我们调用 new File 时需要传入指定的文件路径,这个绝对路径通常是: /storage/emulated/0/... 这种样式,我们要想调用分享时也要变成 Uri 的形式才可以,那么如何把文件路径变成一个文件 Uri ?这个问题下面也一并进行回答。

前面提到了文件 Uri 的三种分类,对应不同类型处理方式也不同,不然你最先遇到的问题就是:

这是由于对系统返回的 Uri 缺失访问权限导致,所以要对应用进行临时访问 Uri 的授权才行,不然会提示权限缺失。

对于要分享系统返回的 Uri 我们可以这样进行处理:

需要注意的是对于自定义 FileProvider 返回 Uri 的处理,即使是设置临时访问权限,但是分享到第三方应用也会无法识别该 Uri

典型的场景就是,我们如果把自定义 FileProvider 的返回的 Uri 设置分享到微信或 QQ 之类的第三方应用,会提示文件不存在,这是因为他们无法识别该 Uri。

关于这个问题的处理其实跟下面要说的把文件路径变成系统返回的 Uri 一样,我们只需要把自定义 FileProvider 返回的 Uri 变成第三方应用可以识别系统返回的 Uri 就行了。

创建 FileProvider 时需要传入一个 File 对象,所以直接可以知道文件路径,那就把问题都转换成了: 如何通过文件路径获取系统返回的 Uri

下面是根据传入的 File 对象和类型来查询系统 ContentProvider 来获取相应的 Uri,已经按照不同文件类型在不同系统版本下的进行了适配。

其中 forceGetFileUri 方法是通过反射实现的,处理 7.0 以上系统的特殊情况下的兼容性,一般情况下不会调用到。Android 7.0 开始不允许 file:// Uri 的方式在不同的 App 间共享文件,但是如果换成 FileProvider 的方式依然是无效的,我们可以通过反射把该检测干掉。

通过 File Path 转成 Uri 的方式,我们最终统一了调用系统分享时传入内容 Uri 的三种不同场景,最终全部转换为传递系统返回的 Uri,让第三方应用能够正常的获取到分享内容。

Share2 按照上述方法进行了具体实施,可以通过下面的方式进行集成:

分享图片到指定界面,比如分享到微信朋友圈

GitHub 项目地址:Share2

哪位大神做过Android自定义分享界面

使用第三方的分享,比如友盟分享,开发者可以自己更改分享界面

android开发怎么分享一个页面

分享一个页面?应该是分享固定的内容吧?

简单的分享调用系统内部提供的就好

Intent intent=new Intent(Intent.ACTION_SEND);

intent.setType("text/plain");

// intent.setPackage("com.sina.weibo");

intent.putExtra(Intent.EXTRA_SUBJECT, "分享");

intent.putExtra(Intent.EXTRA_TEXT, "你好 ");

intent.putExtra(Intent.EXTRA_TITLE, "我是标题");

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

startActivity(Intent.createChooser(intent, "请选择"));

或者高度定制的可以考虑使用sharesdk或者友盟组件

android怎么把其他app的内容分享到自己的app里

很多时候我们的应用在使用微信分享内容之后,希望其他用户点击该分享内容能够跳转到我们的App,以实现闭环,这样的分享才是最有价值的。这种需求涉及到不同应用之间的交互,虽然微信提供了分享SDK,但仍然有不少限制,现在总结两种在Android平台上初步认为可行的方案:

1.分享网页,从分享的网页跳转回原App。

2.分享WXAppExtendObject类型的数据,且只能分享给好友,好友从聊天列表点击收到的分享内容可以直接跳转第三方App(前提是好友手机上已经安装了该App)。

下面来详细说明两个方案,由于是在项目中实测的,为了隐私及行文方便,假设我们的应用的名字为MyApp,效果截图也就不再展示。

方案一:

从WebView(该WebView从属于另一个App,并非我们自己的App)跳转到MyApp的某个界面(这里以跳转到MyApp的Acticity A为例)。具体的实现逻辑如下:

(1)该WebView显示的网页内容只是一个超链接,自定义了一个scheme=myapp://,后边可以附加一些参数,如果需要从网页向App传值的话。

html

head

meta http-equiv="Content-Type" content="text/html; charset=UTF-8"

titleThis is title/title

/head

body

a href=’myapp://id=909624′Jump to MyApp/a

/body

/html

该网页在WebView打开后就是一个简单的超链接,截图不再附。

(2)MyApp中的Activity A需要配置特定的infliter,如下:

activity

intent-filter

data android:scheme="myapp" /

action android:name="android.intent.action.VIEW" /

category android:name="android.intent.category.DEFAULT" /

category android:name="android.intent.category.BROWSABLE"/

/intent-filter

/activity

(3)当在WebView上点击上述自定义的超链接时就可以打开MyApp的A界面,所传递的参数也可以在所跳转到的Activity中获取,方法如下:

getIntent().getScheme();//获得Scheme名称

getIntent().getDataString();//获得Uri全部路径,根据自定义的格式解析字符串即可获取我们上面附加的参数。

可行的实施方案:

MyApp中调用微信分享分享网页内容,只需要在网页中嵌入跟Android客户端约定好的超链接协议scheme,那么点击时就可以跳转到MyApp。

问题1:如果用户安装了MyApp,就可以点击网页跳转,如果没有安装MyApp的话,WebView就会提示找不到该页面。制作网页时可以在网页中做检测,没安装MyApp的话,页面就重定向到应用的下载页面。

问题2:在普通App的WebView中和浏览器中上述机制是可以的,但是在微信的WebView是不可以点击直接跳转我们的应用的,可能是微信做了某些过滤,且仅仅支持跟微信有深度合作的应用的跳转,如大众点评是可以的。针对这种情况,我们可以引导用户使用浏览器打开所分享的网页,然后点击就可以跳转应用了。

方案二:

使用微信SDK分享WXAppExtendObject数据给好友,好友点击跳转MyApp的某个页面(需要在分享时传递构造跳转Intent的参数)。

1.该类型的分享(具体请参考微信分享SDK)可以带几个参数,参数中必须附带一些构造跳转Intent的数据。

2.好友点击分享的内容,回调IWXAPIEventHandler接口的类的onReq方法,具体为

ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:这种情况才会调用,此时可以取出分享时附带在参数中的一些数据,构造一个跳转Intent,调用startActivity(intent) 来打开MyApp。

由于是项目实测,这种实现方式的截图也就不传了。

问题1:该分享方式只能分享给好友,不能分享到朋友圈。

问题2:如果好友没安装MyApp,点击微信中好友分享过来的消息后无反应,无法提醒“未安装MyApp,请下载”,因为这些逻辑要实现的话本身就是在MyApp里面写的,原本没装的话根本无法检测。

问题3:WXAppExtendObject类型的分享,数据有大小限制,

extInfo(String)限制2KB;

fileData(byte[])供第三方使用的文件二进制数据,最大10M;

filePath:(String)Local directory of the file provided for applications,本身长度最大10KB,文件大小同上,不超过10M。

以上就是Android平台好友点击微信分享的内容后跳转来源App的两种实现方案,各有优点和局限性,请根据自身业务需求选择合适的分享方式,由于未能附截图说明,如有哪里表述不清楚的,欢迎留言讨论。

android 怎么自定义共享库

在源码根目录下有个 vendor (供应商) 目录,专门用于存放各个供应商的会有代码。其中有一个个 sample 目录,这是 Google 用于示范如何编写自定义共享库的示例,它展示了自定义共享库、JNI 调用、对库的使用方法及皮肤定制等功能。下面我们通过对该示例进行分析,让大家熟悉这个轻量级的框架。

1、首先看一下 sample 目录的结构:

sample

├── Android.mk

├── apps

│  ├── Android.mk

│  ├── client

│  └── upgrade

├── frameworks

│  ├── Android.mk

│  └── PlatformLibrary

├── MODULE_LICENSE_APACHE2

├── products

│  ├── AndroidProducts.mk

│  └── sample_addon.mk

├── README.txt

├── sdk_addon

│  ├── hardware.ini

│  └── manifest.ini

└── skins

└── WVGAMedDpi

Android.mk: 该文件用于编写构建规则,默认继承 Android 的 make 框架。

frameworks: 该目录在这里的意义等同于 Android 源码中的 frameworks 。

PlatformLibrary: 该目录就自定义共享库。

apps: 该目录用于编写依赖该库的应用程序。经过测试也可以用来编写不依赖该库的程序,这有个好处,让开发商可以把自己特有的应用集成到框架中。

client 与 upgrade: 这是两个依赖该库的应用程序示例。

products: 该目录中的文件对包含该库与 Android 框架集成的信息,如模块名称等。

AndroidProducts.mk: 指明该模块的 make 配置文件的在哪里。

sample_addon.mk :模块的配置信息。

sdk_addon: 该目录对该库的硬件需求进行定义。

hardware.ini: 定义模块对硬件的需求。

manifest.ini: 模块的说明文件。名称、供应商等。

skins: 该目录用于存放自定义皮肤。

WVGAMedDpi: 已经定义好的一套皮肤。

2.如何封装 Java 共享库?

PlatformLibrary 为我们展示了封装 Java 共享库的方法。其目录结构如下: frameworks/PlatformLibrary

├── Android.mk

├── com.example.android.platform_library.xml

├── java

│  └── com

│  └── example

│  └── android

│  └── platform_library

│  └── PlatformLibrary.java

└── README.txt

Android.mk: 该文件说明如何构建该模块。

com.example.android.platform_library.xml: 该文件是模块注册时需要的文件。该文件需要被放置到 /system/etc/permissions 目录下。

Java /*: Java 源码所在目录。具体步骤:

a、编写 Java 库,并将源码放到 java 目录下。这一步和编写普通 Java 程序没有差别。

b、编写 Android.mk,内容如下:

# 获得当前目录,清空环境变量

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS) # 源码所在目录,all-subdir-java-files 表示所有了目录中的 Java 文件。

LOCAL_SRC_FILES := \

$(call all-subdir-java-files) # 该模块是可选的。

LOCAL_MODULE_TAGS := optional # Java 模块名称

LOCAL_MODULE:= com.example.android.platform_library # 编译为 Java 库。最近以 jar 的形式而不是 apk 的形式存在。

include $(BUILD_JAVA_LIBRARY) # 构建该库的 API 文档

include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-subdir-java-files) $(call all-subdir-html-files)

LOCAL_MODULE:= platform_library

# 文档对应的库

LOCAL_DROIDDOC_OPTIONS := com.example.android.platform_library

# 库的类型

LOCAL_MODULE_CLASS := JAVA_LIBRARIES

LOCAL_DROIDDOC_USE_STANDARD_DOCLET := true # 编译为 Java API。

include $(BUILD_DROIDDOC)

c、编写 com.example.android.platform_library.xml,内容如下:

xml version="1.0" encoding="utf-8"

permissions

!-- 库的名称及对应的 Jar 文件位置 --

library name="com.example.android.platform_library"

file="/system/framework/com.example.android.platform_library.jar"/

/permissions 现在基本的库我们已经编写完成,现在需要对框架中的其它文件进行配置。

d、编写 sample/frameworks/Android.mk, 内容如下:

# 包含子目录中的所有 make 文件 include $(call all-subdir-makefiles) 该文件与 sample/Android.mk 文件相同。

e、编写 sample/sdk_addon/manifest.ini,内容如下: # 该模块的名称、供应商及描述

name=Sample Add-On

vendor=Android Open Source Project

description=sample add-on # 构建该模块的 Android 平台代号

api=3 # 模块的版本号。必须为整数。

revision=1 # 该模块中包括的共享库列表

libraries=com.example.android.platform_library # 对每个库的详细定义,格式如下:

# library.name=name.jar;desc # library.name: 通过前面 libraies 定义的库的名称。

# name.jar: 包含库 API 的 jar 文件。该文件放在 libs/add-on 下面。

com.example.android.platform_library=platform_library.jar;Sample optional plaform library 该文件还可包括该模块的其它定义,如皮肤等,为了保持该文档清晰易懂的初衷,这里不做介绍,需要了解可以给我邮件。

f、编写 sample/products/sample_addom.mk,内容如下:

# 要植入系统镜像的应用及可选类库。可以包括 Java 库和本地库。这里我们只有 Java 库。

PRODUCT_PACKAGES := \ com.example.android.platform_library # 把 xml 文件复制到系统镜像中相应的位置去。

PRODUCT_COPY_FILES := \ vendor/

sample/frameworks/PlatformLibrary/com.example.android.platform_library.xml:system/etc/permissions/

com.example.android.platform_library.xml # 这个扩展的名称

PRODUCT_SDK_ADDON_NAME := platform_library # 把模块的 manifest 和硬件配置文件复制到系统镜像中相应的位置。 PRODUCT_SDK_ADDON_COPY_FILES := \

vendor/sample/sdk_addon/manifest.ini:manifest.ini \

vendor/sample/sdk_addon/hardware.ini:hardware.in # 把库的 Jar 包复制到相应的位置。 PRODUCT_SDK_ADDON_COPY_MODULES := \

com.example.android.platform_library:libs/platform_library.jar # 文档的名称。必须与。

#  LOCAL_MODULE:= platform_library

PRODUCT_SDK_ADDON_DOC_MODULE := platform_library # 这个扩展继承系统扩展。 $(call inherit-product, $(SRC_TARGET_DIR)/product/sdk.mk) # 这个扩展的真实名字。这个名字会用于编译。

# 用 'make PRODUCT-PRODUCT_NAME-sdk_addon' 的形式来编译此扩展。

PRODUCT_NAME := sample_addon

g、编写 sample/products/AndroidProducts.mk,内容如下:

PRODUCT_MAKEFILES := \

$(LOCAL_DIR)/sample_addon.mk h、最后运行make -j8 PRODUCT-sample_addon-sdk_addon,编译扩展。

至此,我们就完成了 Java 库的封装。

3、接下来我们再来看如何通过 JNI 的方式对 C 代码进行封装。

a、在 sample/frameworks/PlatformLibrary 目录下添加一个文件夹,用于放置 JNI 本地代码,目录结构如下:

frameworks/PlatformLibrary/jni

├── Android.mk

└── PlatformLibrary.cpp

b、把 frameworks/PlatformLibrary/java/com/example/android/platform_library/PlatformLibrary.java

文件改写为 JIN 调用接口,代码如下 : package com.example.android.platform_library; import android.util.Config;

import android.util.Log; public final class PlatformLibrary {

static { / Load the library. If it's already loaded, this does nothing. System.loadLibrary("platform_library_jni");

private int mJniInt = -1;   public PlatformLibrary() {}   / Test native methods.   public int getInt(boolean bad) {

// this alters mJniInt //

int result = getJniInt(bad); // reverse a string, for no very good reason //

String reverse = reverseString("Android!"); Log.i("PlatformLibrary", "getInt: " + result + ", '" + reverse + "'"); return mJniInt; //

/ Simple method, called from native code.   private static void yodel(String msg) {

Log.d("PlatformLibrary", "yodel: " + msg); //

/ Trivial native method call. If "bad" is true, this will throw an

/ exception.   native private int getJniInt(boolean bad);   / Native method that returns a new string that is the reverse of

/ the original. This also calls yodel().   native private static String reverseString(String str);

}

c、在 frameworks/PlatformLibrary/jni/PlatformLibrary.cpp 中编写 PlatformLibrary.java 中规定本地调用的具体实现。

d、编写 frameworks/PlatformLibrary/jni/Android.mk,内容如下:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional # JNI 模块的名称

LOCAL_MODULE:= libplatform_library_jni # 依赖的源代码文件

LOCAL_SRC_FILES:= \

PlatformLibrary.cpp # 编译时需要的库

LOCAL_SHARED_LIBRARIES := \

libandroid_runtime \

libnativehelper \

libcutils \

libutils # 没有静态库

LOCAL_STATIC_LIBRARIES := # 包含必须的 JNI 头文件

LOCAL_C_INCLUDES += \

$(JNI_H_INCLUDE) # 编译器选项

LOCAL_CFLAGS += # 对该模块不进行预编译。使用预编译可以提高模块的性能。

LOCAL_PRELINK_MODULE := false # 把它编译成动态共享库

include $(BUILD_SHARED_LIBRARY) 该文件主要定义了本地库的名字、依赖、编译选项及编译方式。

e、修改 frameworks/PlatformLibrary/Android.mk,在末尾添加如下两行:

include $(CLEAR_VARS) # 调用子目录中的 make 文件。

include $(call all-makefiles-under,$(LOCAL_PATH))

f、修改 sdk_addon/sample_addon.mk,在PRODUCT_PACKAGES 中添加该 JNI 本地库。

PRODUCT_PACKAGES := \

com.example.android.platform_library \

libplatform_library_jni

g、编译即可。至此,添加 JNI 库完毕。

4、添加接下来我们再看看如何添加原生应用程序

添加原生应用程序就很简单了,只需要把按照 Android 应用开发的基本方法,写好一个应用,该应用可以依赖这个扩展,也可以不依赖。如 sample 中的 client 应用,目录结构如下: apps/client/

├── AndroidManifest.xml

├── Android.mk

└── src

└── com

└── example

└── android

└── platform_library

└── client

└── Client.java

a、在应用根目录中添加一个 Android.mk 文件,内容如下:

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS) LOCAL_MODULE_TAGS := user # 目标名称

LOCAL_PACKAGE_NAME := PlatformLibraryClient # 只编译这个apk包中的java文件

LOCAL_SRC_FILES := $(call all-java-files-under, src) # 使用当前版本的 SDK

LOCAL_SDK_VERSION := current # 依赖使用刚才编写的扩展

LOCAL_JAVA_LIBRARIES := com.example.android.platform_library include $(BUILD_PACKAGE)

b、在 AndroidManifest.xml 中添加一句:

uses-library android:name="com.example.android.platform_library" /

c、修改 sdk_addon/sample_addon.mk,在PRODUCT_PACKAGES 中添加该 JNI 本地库。

PRODUCT_PACKAGES := \

com.example.android.platform_library \

libplatform_library_jni \

PlatformLibraryClient

d、编译即可。至此,添加 JNI 库完毕。

5、其他功能如添加皮肤等,这里就不一一示范了,请参考sdk-src/vendor/sample。

android自定义分享页面代码下载的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Android分享文件、android自定义分享页面代码下载的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/2496.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载