我想做的事情似乎很简单,但经过几天的搜索,我无法弄明白.
我有一个应用程序,允许用户选择多个(最多5个)图像.我正在使用ImageView
.当用户点击时ImageView
,我想允许他们选择
我开始使用ACTION_GET_CONTENT
意图,这对于进入画廊非常有用.那么我尝试使用ACTION_PICK_ACTIVITY
意图允许用户选择相机或图库:
Intent pickIntent = new Intent(Intent.ACTION_PICK_ACTIVITY);
Intent gallIntent=new Intent(Intent.ACTION_GET_CONTENT);
gallIntent.setType("image/*");
Intent camIntent = new Intent("android.media.action.IMAGE_CAPTURE");
pickIntent.putExtra(Intent.EXTRA_INTENT, camIntent);
pickIntent.putExtra(Intent.EXTRA_INTENT, gallIntent)
pickIntent.putExtra(Intent.EXTRA_TITLE, "Select Source");
startActivityForResult(pickIntent, IMAGE_SELECTOR);
Run Code Online (Sandbox Code Playgroud)
但似乎我只能添加一个EXTRA_INTENT
.菜单按预期显示,但唯一的选项是图库和文件....没有相机).
有没有更好/更简单的方法来做到这一点,我错过了?谢谢你的帮助.
android android-intent android-gallery android-camera android-intent-chooser
设备:模拟器像素 3a - Android 11
代码:
final List<Intent> cameraIntents = new ArrayList<Intent>();
final Intent captureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
final List<ResolveInfo> listCam =
context.getPackageManager().queryIntentActivities(captureIntent, 0);
Run Code Online (Sandbox Code Playgroud)
使用时:
targetSdkVersion 30
compileSdkVersion 30
Run Code Online (Sandbox Code Playgroud)
listCam 大小为 0
当更改为:
compileSdkVersion 29
Run Code Online (Sandbox Code Playgroud)
listCam 大小为 1 - 应该如此。
使用以下代码:
val captureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
baseActivity.startActivity(captureIntent)
Run Code Online (Sandbox Code Playgroud)
工作正常并显示相机应用程序。
知道为什么 queryIntentActivities 不返回相机意图吗?
谢谢!
android android-intent android-camera android-camera-intent android-intent-chooser
我有一些存储在本地应用程序中的图像与某些上下文(如联系人)相关联.我正在使用直接共享(API 23+)ChooserTargetService
来显示这些可供选择,我希望ChooserTarget
实例Icon
填充这些图像.
所以我认为我可以android.support.v4.content.FileProvider
用于此(内部ChooserTargetService::onGetChooserTargets
):
val file = File(File(filesDir, "images"), imageFileName)
val contentUri = FileProvider.getUriForFile(this, "com.company.fileprovider", file)
val icon = Icon.createWithContentUri(contentUri)
Run Code Online (Sandbox Code Playgroud)
并在清单中:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mycompany.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths"/>
</provider>
Run Code Online (Sandbox Code Playgroud)
但问题是我得到了一个例外
05-10 16:06:09.100 32444-32444/android:ui W/Icon: Unable to load image from URI: content://com.mycompany.fileprovider/images/icon_dice.png
java.lang.SecurityException: Permission Denial: reading android.support.v4.content.FileProvider uri content://com.mycompany.fileprovider/images/icon_dice.png from pid=32444, uid=1000 requires the provider be exported, or grantUriPermission()
at android.os.Parcel.readException(Parcel.java:1684)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:183)
at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:146)
at android.content.ContentProviderProxy.openTypedAssetFile(ContentProviderNative.java:692)
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1147)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:984) …
Run Code Online (Sandbox Code Playgroud) android android-contentprovider android-support-library android-intent-chooser
我试图让用户从图库中选择图像,或者用相机拍照.我试过这个:
Intent imageIntent = new Intent(Intent.ACTION_GET_CONTENT);
imageIntent.setType("image/*");
startActivityForResult(Intent.createChooser(imageIntent, "Select Picture"), GET_IMAGE_REQUEST);
Run Code Online (Sandbox Code Playgroud)
但它自动显示图库,甚至没有提供选择活动的选项.似乎应该有一些更好的方法来实现这个,而不是在这个问题中给出的解决方案.这真的是唯一的方法吗?
android android-intent android-gallery android-camera android-intent-chooser
基本上,当一个应用程序共享一个视频网址时,我的应用程序应该显示在列表中,但事实并非如此.MXPlayer和谷歌照片媒体播放器都没有显示好和全播(最近有一个版本来解决这个问题).
我写了一个快速的应用来测试这个问题,这里是我的清单过滤器:
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="video/*"/>
<data android:mimeType="audio/*"/>
<data android:mimeType="image/*"/>
<action android:name="android.intent.action.SEND"/>
</intent-filter>
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:mimeType="video/*" android:scheme="http"/>
<data android:mimeType="audio/*" android:scheme="http"/>
<data android:mimeType="image/*" android:scheme="http"/>
<data android:mimeType="video/*" android:scheme="https"/>
<data android:mimeType="audio/*" android:scheme="https"/>
<data android:mimeType="image/*" android:scheme="https"/>
<data android:mimeType="video/*" android:scheme="file"/>
<data android:mimeType="audio/*" android:scheme="file"/>
<data android:mimeType="image/*" android:scheme="file"/>
<action android:name="android.intent.action.VIEW"/>
</intent-filter>
<intent-filter>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:host="*" android:pathPattern=".*\\.mp4" android:scheme="http"/>
<action android:name="android.intent.action.VIEW"/>
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
这是重现问题的代码:
Intent intent = new Intent("android.intent.action.VIEW");
intent.setDataAndType(Uri.parse("http://media.w3.org/2010/05/sintel/trailer.mp4"),"video/*");
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
这只是Marshmallow的一个问题.
编辑:我应该补充一点,并非所有棉花糖设备都这样做.我第一次听说它时花了很长时间才重现它,有一天它刚刚开始在我的Nexus 5上发生.我的6P将无法重现这一点. …
android android-intent android-filter android-6.0-marshmallow android-intent-chooser
我在找到答案后创建了这个问题,我不确定礼仪,但似乎没问题(另外,我现在看到有一个内置选项).
问题如标题中所述,我们使用类似于此的代码创建了一个意图选择器:
String url = "waze://?ll=" + latitude + ", " + longitude + "&navigate=yes";
Intent intentWaze = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
String uriGoogle = "google.navigation:q=" + latitude + "," + longitude;
Intent intentGoogleNav = new Intent(Intent.ACTION_VIEW, Uri.parse(uriGoogle));
String title = context.getString(R.string.title);
Intent chooserIntent = Intent.createChooser(intentGoogleNav, title);
Intent[] arr = new Intent[1];
arr[0] = intentWaze;
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, arr);
context.startActivity(chooserIntent);
Run Code Online (Sandbox Code Playgroud)
并获得两个Waze图标和一个Google Maps图标; 更糟糕的是,其中一个Waze图标没有启动导航(只打开应用程序).
我们无法使用geo:
意图,因为我们需要控制显示的意图(我们不想一直显示两个意图)和谷歌地图中的导航类型(例如:) &mode=w
.
我试图让我自己的Chooser Activity来代替orroids share to ... popup.
我看了一下ChooserActivity扩展ResolverActivity并尝试复制代码.在我的清单中,我有
<intent-filter>
<action android:name="android.intent.action.CHOOSER" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Run Code Online (Sandbox Code Playgroud)
而在onCreate我做
Intent intent = getIntent();
Parcelable parcelable = intent.getParcelableExtra("android.intent.extra.INTENT");
Intent shareIntent = (Intent) parcelable;
shareIntent.setComponent(new ComponentName(packageName, activityName));
startActivity(shareIntent);
finish();
Run Code Online (Sandbox Code Playgroud)
这有效,但附加了文件的共享除外.在那里,我得到了这个崩溃:
java.lang.SecurityException: UID 10098 does not have permission to content://com.android.chrome.FileProvider/images/screenshot/15305419271134395322470190280016.jpg [user 0]
at android.os.Parcel.readException(Parcel.java:1942)
at android.os.Parcel.readException(Parcel.java:1888)
at android.app.IActivityManager$Stub$Proxy.startActivity(IActivityManager.java:4365)
at android.app.Instrumentation.execStartActivity(Instrumentation.java:1610)
at android.app.Activity.startActivityForResult(Activity.java:4472)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
at android.app.Activity.startActivityForResult(Activity.java:4430)
at androidx.fragment.app.FragmentActivity.startActivityForResult(FragmentActivity.java:741)
at android.app.Activity.startActivity(Activity.java:4791)
at android.app.Activity.startActivity(Activity.java:4759)
Run Code Online (Sandbox Code Playgroud)
看起来我的活动无法执行原始意图,因为它没有这些文件的权限.可以做些什么来解决这个问题?有办法获得许可吗?毕竟,android也以某种方式做到了.
我已经尝试了一些修复,但到目前为止还没有任何工作.如果我不能使它工作,我想从android调用通常的共享菜单来处理这个,但我也无法做到这一点.
addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION|Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
Run Code Online (Sandbox Code Playgroud)
不起作用,因为这些标志已存在于intent中.另一方面,删除它们将导致共享工作,但文件将不会被共享,它将为空.
startActivity(Intent.createChooser(shareIntent, "test");
Run Code Online (Sandbox Code Playgroud)
会抛出同样的异常.
startActivity(Intent.createChooser(intent, "test"));
Run Code Online (Sandbox Code Playgroud)
我试图通过为原始意图制作一个选择器来调用android共享菜单,但它只是给了我一个窗口,让我选择我的应用程序. …
我在我的应用程序中实现了一个文件选择器,如下所示:
Intent intent = new Intent();
intent.setType("*/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(Intent.createChooser(intent, "Title"), FILE_PICK);
Run Code Online (Sandbox Code Playgroud)
这是一个已知问题,您无法通过这种方式轻松获取实际文件位置,因为 Intent 会返回一些您无法真正用于创建 File 对象的奇怪 Uri。
我正在使用这种方法来获取实际的文件路径:
/**
* Get a file path from a Uri. This will get the the path for Storage Access
* Framework Documents, as well as the _data field for the MediaStore and
* other file-based ContentProviders.
*
* @param context The context.
* @param uri The Uri to query.
* @author paulburke
*/
public static String getPath(final Context context, final Uri uri) { …
Run Code Online (Sandbox Code Playgroud) 我想在我用createChooser()对话框呈现他之后检测用户选择的应用程序.所以我创建了我的BroadcastReceiver
子类,如下所示:
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class ShareBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("INFORMATION", "Received intent after selection: "+intent.getExtras().toString());
}
}
Run Code Online (Sandbox Code Playgroud)
我还将我的接收器添加到我的android 清单文件中:
<application>
...
...
...
<receiver android:name=".helpers.ShareBroadcastReceiver" android:exported="true"/>
</application>
Run Code Online (Sandbox Code Playgroud)
这是调用createChooser对话框的代码:
Intent sendIntent = new Intent(android.content.Intent.ACTION_SEND);
sendIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
sendIntent.setType("image/png");
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP_MR1) {
Log.d("INFORMATION", "The current android version allow us to know what app is chosen by the user.");
Intent receiverIntent = …
Run Code Online (Sandbox Code Playgroud) android android-pendingintent android-broadcastreceiver android-intent-chooser
我的应用程序共享一个特定的 URL 以在其他应用程序中打开,但我想根据用户与之共享的应用程序使用自定义 URL。例如,我想用 Gmail ,我想myurl.com?src=gmail
用 FBmyurl.com?src=fb
等等。
这通常适用于这个著名的方法:https : //stackoverflow.com/a/18068122/3015986。但是,在 Android 10 中,该解决方案不再有效:https : //medium.com/@AndroidDeveloperLB/this-wont-work-anymore-on-android-q-1702c19eb7bb
那么,还有哪些其他选择呢?