android:如何从图库共享意图启动服务

时间:2014-05-08 05:54:17

标签: android android-intent gallery share

我正在开发一款应用程序,可以让用户通过电子邮件发送照片,而无需打开电子邮件应用程序(用户只需点击分享按钮,app就会自动发送带有照片附件的电子邮件。

要实现这一点,我想通过...菜单在图库共享中选择我的应用后直接启动服务。

我现在正在做的是创建一个透明的活动,它工作正常,但它阻止用户浏览图库,直到发送电子邮件

那么我怎么能解决这个问题呢?我想我可以创建透明的活动来启动服务,但它真的是实现我想要的最佳方式吗?

编辑(部分代码):

使用图库共享意图时显示透明的发送活动

<activity
            android:name="com.VN.PicSharer.sendActivity"
             android:theme="@style/Theme.Transparent"
            android:label="string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.SEND" />

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

                <data android:mimeType="image/*" />
            </intent-filter>
        </activity>

并显示一段代码用于从图库中获取数据

public class sendActivity extends Activity {

    Context con;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();
        StrictMode.setThreadPolicy(policy);
        Intent intent = getIntent();
        String action = intent.getAction();
        File file;
        Bundle extras = intent.getExtras();
        con = getApplicationContext();

        if (Intent.ACTION_SEND.equals(action)) {
            if (extras.containsKey(Intent.EXTRA_STREAM)) {
                try {
//code for sending email with attachment

EDIT2:已解决。 改变了我的startActivity类,使其像服务激活器一样,并且在其意图中需要数据来附加图片:

intent = new Intent(this, SendService.class);
        Intent mIntent = getIntent();
        Bundle extras = mIntent.getExtras();
        String action = mIntent.getAction();

        intent.putExtra("bundle", extras);
        intent.putExtra("string", action);

        startService(intent);

        onBackPressed();

在我的服务中,我使用AsyncTask发送电子邮件(因为没有它,在几秒钟内发送几张照片应用程序会暂时冻结)。

希望这可以帮助你们中的一些人!

1 个答案:

答案 0 :(得分:0)

您可以使用onActivityResult并检查RESULT_OK是否如此,然后继续您要执行的流程。

- 执行完您的流程后,在完成后将其添加到该流程中,这将打开用户主屏幕并保持设备正常运行。

moveTaskToBack(true);