Android: 更新 ShareActionProvider Intent 中的图片 Uri
Android: Update Image Uri in Intent of ShareActionProvider
我有两个应用程序,我需要从一个到另一个共享数据(文本和图像)。一切正常,除了,如果我在更改文本后更改图像(我在输入文本后上传照片,或者我在输入文本后重新上传图像),我的图像不会在第二个应用程序中更新。我需要像 ImageView 的 TextWatcher 这样的东西。有什么想法吗?
这是我第一次申请的重要部分:
Uri imageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public void afterTextChanged(Editable s) {
if (mShareActionProvider != null) {
mShareActionProvider.setShareIntent(setShareIntent());
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.layout_menu, menu);
MenuItem share = menu.findItem(R.id.menu_item_share);
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(share);
mShareActionProvider.setShareIntent(setShareIntent());
invalidateOptionsMenu();
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
setMessageIntent();
return super.onOptionsItemSelected(item);
}
private Intent setShareIntent() {
String share = message.getText().toString();
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
if (imageUri != null) {
shareIntent.setType("image/png");
} else {
shareIntent.setType("text/plain");
}
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Here goes my sharing");
shareIntent.putExtra(Intent.EXTRA_TEXT, share);
return shareIntent;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
imageUri = data.getData();
String[] path = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(imageUri, path, null, null, null);
cursor.moveToFirst();
int index = cursor.getColumnIndex(path[0]);
String imgString = cursor.getString(index);
image.setImageURI(imageUri);
break;
}
}
这是我的第二个应用程序,我在其中共享数据:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent receiver = getIntent();
String received_text = receiver.getStringExtra(receiver.EXTRA_TEXT);
Uri imageUri = (Uri) receiver.getParcelableExtra(Intent.EXTRA_STREAM);
if (imageUri != null) {
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
} catch (IOException e) {
e.printStackTrace();
}
image.setImageBitmap(bitmap);
}
if (received_text != null) {
text.setText(received_text);
}
}
当第一次上传图片到另一个应用程序时,它的时间 onCreate 方法第一次在第二个应用程序中调用 在你第二次从第一个应用程序调用图像到另一个应用程序时,如果第二个应用程序已经创建,那么此时不会调用 onCrete 所以onResume 方法更适合你。
我不知道这样做是否愚蠢并且会导致进一步的问题,但现在它工作得很好。如果有人认为这是个坏主意,请告诉我原因。
这就是我所做的:
- 我将 shareIntent 声明为全局。
- 我在上传新照片后也把 imageUrl 放在了 intent 中
- 我将 imageUrl 放在 afterTextChanged() 函数的意图中,所以每次我更改文本时,我的新 imageUri 也会被设置。
我有两个应用程序,我需要从一个到另一个共享数据(文本和图像)。一切正常,除了,如果我在更改文本后更改图像(我在输入文本后上传照片,或者我在输入文本后重新上传图像),我的图像不会在第二个应用程序中更新。我需要像 ImageView 的 TextWatcher 这样的东西。有什么想法吗?
这是我第一次申请的重要部分:
Uri imageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
@Override
public void afterTextChanged(Editable s) {
if (mShareActionProvider != null) {
mShareActionProvider.setShareIntent(setShareIntent());
}
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.layout_menu, menu);
MenuItem share = menu.findItem(R.id.menu_item_share);
mShareActionProvider = (ShareActionProvider) MenuItemCompat.getActionProvider(share);
mShareActionProvider.setShareIntent(setShareIntent());
invalidateOptionsMenu();
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
setMessageIntent();
return super.onOptionsItemSelected(item);
}
private Intent setShareIntent() {
String share = message.getText().toString();
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, imageUri);
if (imageUri != null) {
shareIntent.setType("image/png");
} else {
shareIntent.setType("text/plain");
}
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "Here goes my sharing");
shareIntent.putExtra(Intent.EXTRA_TEXT, share);
return shareIntent;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
imageUri = data.getData();
String[] path = {MediaStore.Images.Media.DATA};
Cursor cursor = getContentResolver().query(imageUri, path, null, null, null);
cursor.moveToFirst();
int index = cursor.getColumnIndex(path[0]);
String imgString = cursor.getString(index);
image.setImageURI(imageUri);
break;
}
}
这是我的第二个应用程序,我在其中共享数据:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent receiver = getIntent();
String received_text = receiver.getStringExtra(receiver.EXTRA_TEXT);
Uri imageUri = (Uri) receiver.getParcelableExtra(Intent.EXTRA_STREAM);
if (imageUri != null) {
Bitmap bitmap = null;
try {
bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), imageUri);
} catch (IOException e) {
e.printStackTrace();
}
image.setImageBitmap(bitmap);
}
if (received_text != null) {
text.setText(received_text);
}
}
当第一次上传图片到另一个应用程序时,它的时间 onCreate 方法第一次在第二个应用程序中调用 在你第二次从第一个应用程序调用图像到另一个应用程序时,如果第二个应用程序已经创建,那么此时不会调用 onCrete 所以onResume 方法更适合你。
我不知道这样做是否愚蠢并且会导致进一步的问题,但现在它工作得很好。如果有人认为这是个坏主意,请告诉我原因。 这就是我所做的:
- 我将 shareIntent 声明为全局。
- 我在上传新照片后也把 imageUrl 放在了 intent 中
- 我将 imageUrl 放在 afterTextChanged() 函数的意图中,所以每次我更改文本时,我的新 imageUri 也会被设置。