构建一个能够接收别的App数据的APP

我们都知道每个Android手机上都有图库,图库中的图片可以发送给别的APP进行显示,比如发送给微信好友、发送到朋友圈以及发送给电脑等(这个经常使用)。那这是怎么实现的呢,我们能不能自己构建一个APP,当在图库中点击发送的时候能够从可选项中找到我们的APP,然后在APP当中显示图片。这是可以的,而且非常简单。


在两个应用之间发送和接收数据最普遍的方式就是使用intent。Inetnt允许用户快速以及简单的共享数据。


怎么通过Intent给别的APP发送数据


往别的APP发送文字:

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(sendIntent);
当然我们知道,可以通过调用Intent.createChooser函数,把intent传给他,将返回一个总是显示选择对话框的intent,这样做有诸多好处:
1、即使用户之前已经为这个intent选择了一个默认的动作,chooser依然会弹出
2、如果没有应用匹配这个动作,将弹出一个系统消息
3、你可以为这个选择对话框制定一个标题

代码如下所示:

Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "This is my text to send.");
sendIntent.setType("text/plain");
startActivity(Intent.createChooser(sendIntent, getResources().getText(R.string.send_to)));

往别的APP发送二进制内容:

二进制数据通过使用ACTION_SEND动作结合合适的MIME类型以及把指向要发送数据的URI放到一个叫做EXTRA_STREAM的extra当中,从而进行分享。这种方式通常用来共享图片,当然也可以共享任何类型的二进制内容。如下代码发送一张jpeg格式的图片:

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.setType("image/jpeg");
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));

接收的APP需要有读取这个URI的权限,推荐的方法是把URI指向的数据保存到ContentProvider或者MediaStore当中。


往别的APP发送多个内容:

如果要想共享多块内容,使用ACTION_SEND_MULTIPLE动作以及结合一系列指向内容的URLs。这个MIME类型根据你要共享的内容的不同而不同。例如,如果你共享三张JPEG图像,类型还是“image/jpeg”,对于一个混合的图像类型,应该使用"image/*"来匹配能够处理任何图像类型的activity。你应该使用“*/*”如果你想要共享类型比较宽泛的数据。

ArrayList<Uri> imageUris = new ArrayList<Uri>();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType("image/*");//各种类型的图像
startActivity(Intent.createChooser(shareIntent, "Share images to.."));

以上讲了怎么通过Intent给别的APP发送内容。既然图库可以发送图片,那么肯定是执行了ACTION_SEND(发送单张)或者ACTION_SEND_MULTIPLE操作(发送多张),下面来验证一下!


构建自己的APP

首先要想在图库中点击发送的时候,系统能够发现我们的APP。需要在我们开发的APP的Manifest文件当中给需要接收图片的Activity增加Intent filters,如下所示,代表ShareActivity能够处理文本、单张图片以及多张图片:

 <!-- 接收分享数据的Activity-->
        <activity android:name=".ShareActivity">
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="image/*" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.SEND" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="text/plain" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.SEND_MULTIPLE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:mimeType="image/*" />
            </intent-filter>
        </activity>
这样当我们把这个APP安装到手机上面。点击图库中图片的发送,系统就会发现我们的APP,然后就能够发送图片给我们的APP。因此,我们必须在系统启动以上ShareActivity的时候根据Action进行相应的处理,得到图片的URI,然后显示出来。


ShareActivity的oncreate如下所示,通过getIntent()得到Intent,然后得到相应的Action和type,然后执行相应的操作,这里使用了ImageLoader进行图片的显示,因为它会自动根据ImageView的大小进行图片的压缩以便于显示。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_share);
        initViews();
        initImageLoader(this);//初始化IamgeLoader
        Intent intent = getIntent();
        String action = intent.getAction();
        String type = intent.getType();
        tv_display.setText("Action: " + action + "\r\n" + "Type: " + type + "\r\n");
        if (Intent.ACTION_SEND.equals(action) && type != null) {
            if ("text/plain".equals(type)) {
                handleSendText(intent); // Handle text being sent
            } else if (type.startsWith("image/")) {
                handleSendImage(intent); // Handle single image being sent
            }
        } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
            if (type.startsWith("image/")) {
                handleSendMultipleImages(intent); // Handle multiple images being sent
            }
        } else {
            // 手动启动
        }
    }

处理文本:

  /**
     * 处理文本
     *
     * @param intent
     */
    void handleSendText(Intent intent) {
        String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
        if (sharedText != null) {
            tv_display.append("SharedText:" + sharedText);
        }
    }


处理单张图片:

  /**
     * 处理单张图片
     *
     * @param intent
     */
    void handleSendImage(Intent intent) {
        Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
        tv_display.append("ImageUri:" + imageUri.toString());
        ImageLoader.getInstance().displayImage(imageUri.toString(), iv_display);
    }

处理多张图片:

/**
 * 处理多张图片
 *
 * @param intent
 */
void handleSendMultipleImages(Intent intent) {
    ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
    if (imageUris != null) {
        tv_display.append("ImageUri:" + imageUris.toString());
        //把图片显示到GridView
    }
}

初始化ImageLoader:
 /**
     * 初始化ImageLoader
     *
     * @param context
     */
    public static void initImageLoader(Context context) {
        DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder() //
                .showImageForEmptyUri(R.mipmap.ic_launcher) //
                .showImageOnFail(R.mipmap.ic_launcher) //
                .cacheInMemory(true) //
                .cacheOnDisk(true) //
                .build();//
        ImageLoaderConfiguration config = new ImageLoaderConfiguration//
                .Builder(context)//
                .defaultDisplayImageOptions(defaultOptions)//
                .discCacheSize(50 * 1024 * 1024)//
                .discCacheFileCount(100)// 缓存一百张图片
                .writeDebugLogs()//
                .build();//
        ImageLoader.getInstance().init(config);
    }

下面来看一下效果:

如上图所示,当点击图片的发送按钮的时候,出现了我们自己的APP,当点击APP的时候,跳转到如下界面:


从上图可以看出:Action、type以及data完全符合预期,且接收到的图片显示了出来。

当我们发送多张图片给我们的APP的时候,界面如下,也是符合预期的!



  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: App Inventor 是一款用于创建移动应用程序的编程工具。要实现在 App Inventor 中利用蓝牙接收数据并绘图,可以按以下步骤进行: 1. 打开 App Inventor 并创建一个新的应用程序项目。 2. 在设计视图中,将蓝牙组件拖放到屏幕上,并将其命名为“蓝牙”。 3. 在蓝牙组件属性中,设置蓝牙适配器为“Classic”。这样可以保证与大多数蓝牙设备兼容。 4. 添加一个按钮组件,以便在点击按钮时进行连接蓝牙设备的操作。 5. 在按钮的点击事件中,使用蓝牙组件的“连接到设备”的命令,指定要连接的蓝牙设备的地址。 6. 在屏幕上添加一个画布组件,并将其命名为“画布”。 7. 在蓝牙组件的“接收到消息”事件中,编写处理接收到蓝牙数据的代码。例如,你可以将数据解析为数字,并将其存储在变量中。 8. 在接收数据后,可以使用“画布”组件的绘图命令,在画布上绘制相应的图形。例如,你可以将收到的数据绘制为折线图、柱状图或其他类型的图表。 9. 根据你的需求,你可以使用定时器组件来定期接收和绘制数据,以保持实时性。 10. 最后,测试你的应用程序。确保你的蓝牙设备正确连接,并能够接收数据并在画布上绘制相应的图形。 请注意,这只是一个简单的示例,你可以根据自己的需求进行更复杂的数据处理和图形绘制。同时,在实际开发中,还需要考虑错误处理、用户交互和应用程序的稳定性等因素。 ### 回答2: 要用App Inventor实现蓝牙接收数据并绘图,可以按照以下步骤进行: 1. 首先,在App Inventor中创建一个新的项目,并导入蓝牙扩展库。 2. 在设计视图中添加一个按钮,用于连接蓝牙设备。给按钮添加一个点击事件,在该事件中使用蓝牙扩展库的相关功能连接目标蓝牙设备。 3. 添加一个文本框或标签组件,用于显示接收到的数据。 4. 在连接成功后,可以通过蓝牙扩展库的"当接收到的值"事件来接收蓝牙设备发送的数据。将接收到的数据显示在文本框或标签中。 5. 接收到的数据可以是用逗号分隔的x和y坐标值。使用分割文本功能将接收到的数据分割为x和y坐标值。 6. 在绘图区域中添加一个画布组件,用于绘图。可以在屏幕上绘制直线、曲线、圆或其他图形。 7. 在接收数据后,根据接收到的x和y坐标值,在画布上绘制相应的图形。可以使用画布组件的绘制线条或绘制圆等功能。 8. 可以在绘图区域添加一个清除按钮,用于清除已绘制的图形。 9. 最后,测试应用程序。通过连接蓝牙设备,并在设备上发送坐标数据,观察应用程序是否能够正确接收数据并在绘图区域上绘制图形。 通过以上步骤,你就能够App Inventor实现蓝牙接收数据并绘图的功能了。 ### 回答3: 要使用App Inventor来实现蓝牙接收数据并绘图,需要经过以下几个步骤: 1. 创建一个App Inventor项目,打开设计界面。 2. 在"Designer"选项卡中,从"Palette"面板中找到并拖动一个Canvas组件到屏幕上,用于绘制图形。 3. 从"Non-visible Components"面板中找到并拖动一个BluetoothClient组件,用于与蓝牙设备进行通信。 4. 在"Blocks"选项卡中,使用相关的模块构建程序逻辑。 以下是一个简单的实例来说明如何实现蓝牙接收数据并绘图: 1. 连接到蓝牙设备: - 在屏幕上添加一个按钮/Button组件,用于触发连接事件。 - 在按钮的"Click"事件中,使用BluetoothClient的"Connect"方法连接到蓝牙设备。 2. 接收蓝牙数据并解析: - 在BluetoothClient的"AfterConnect"事件中,使用BluetoothClient的"ReceiveText"方法接收蓝牙设备发送的文本数据。 - 对接收到的数据进行解析,根据预定的格式提取需要绘制的图形数据。 3. 绘制图形: - 在接收和解析数据后,将需要绘制的图形数据存储在变量中。 - 在Canvas的"Drawn"事件中,使用Canvas的绘制方法(例如DrawRectangle、DrawCircle)根据存储的图形数据绘制图形。 通过以上步骤,你就可以用App Inventor实现蓝牙接收数据并绘制图形的功能了。当然,这只是一个简单的示例,你可以根据实际需求和复杂程度进行相应的扩展和优化。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值