- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试构建一个相机 Activity 来拍摄照片并将其保存到 SD 卡上。但我发现我的代码在用于获取文件 Uri 的方法以及 putExtra()
方法上出现了问题。
当调用 startCamera()
函数时,相机 Intent 不会启动并终止 Activity。
private void startCamera(int actionCode) {
//Create a camera intent
Intent camera_intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
switch (actionCode) {
case CAM_REQ_CODE:
File photo_file = null;
try {
photo_file = setUpPhotoFile();
} catch (IOException e) {
e.printStackTrace();
photo_file = null;
photo_path = null;
}
// Continue only if the File was successfully created
if (photo_file != null) {
photo_path = photo_file.getAbsolutePath();
Uri photoURI = Uri.fromFile(photo_file); //works
//Uri photoURI = FileProvider.getUriForFile(InStore.this,"babygroot.iamgroot.fileprovider", photo_file);
// PROBLEM!! how to overcome putExtra method to pass photo URI to MediaStore.EXTRA_OUTPUT
camera_intent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
startActivityForResult(camera_intent, CAM_REQ_CODE);
}
break;
default:
break;
}
}
这是我的 list :
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="babygroot.iamgroot">
<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-feature android:name="android.hardware.camera" />
<!--<uses-feature android:name="android.hardware.camera2" /> -->
<uses-feature android:name="android.hardware.camera.autofocus" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="babygroot.iamgroot.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
<activity android:name=".LoginScreen">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".QRCode"
android:parentActivityName=".LoginScreen" />
<activity
android:name=".SignUp"
android:parentActivityName=".LoginScreen" />
<activity
android:name=".InStore"
android:parentActivityName=".QRCode" />
<activity android:name=".CheckOut" />
</application>
</manifest>
InStore Activity 是使用相机功能的地方。
这是失败时的堆栈跟踪
Process: babygroot.iamgroot, PID: 26238
java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/Pictures/IAMGROOTPics/IMG_20171213_141445_787397456.jpg
at android.support.v4.content.FileProvider$SimplePathStrategy.getUriForFile(FileProvider.java:712)
at android.support.v4.content.FileProvider.getUriForFile(FileProvider.java:401)
at babygroot.iamgroot.InStore.startCamera(InStore.java:172)
at babygroot.iamgroot.InStore.showCameraPreview(InStore.java:111)
at babygroot.iamgroot.InStore.access$000(InStore.java:28)
at babygroot.iamgroot.InStore$1.onClick(InStore.java:63)
at android.view.View.performClick(View.java:5646)
at android.view.View$PerformClick.run(View.java:22459)
at android.os.Handler.handleCallback(Handler.java:761)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:156)
at android.app.ActivityThread.main(ActivityThread.java:6523)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:942)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:832)
res/xml/file_paths.xml:
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/com.example.package.babygroot.iamgroot/files/Pictures" />
</paths>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="Android/data/com.example.package.babygroot.iamgroot/files/Pictures" />
</paths>
最佳答案
问题是 Android 现在不允许读取其他应用程序的文件,这就是您的代码崩溃的原因。看这个7.0 behaviour changes
请参阅本教程以使用 FileProvider 执行任务 https://drivy.engineering/android-fileprovider/
您基本上声明了一个共享文件位置,以便应用程序可以在那里读写。然后在那里创建一个文件并使用该文件的 Uri 打开相机 Intent 。
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<files-path name="shared" path="shared/"/>
</paths>
Menfiest 文件声明
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="<your provider authority>"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_provider_paths"/>
</provider>
终于
Uri sharedFileUri = FileProvider.getUriForFile(this, <your provider auhtority>, sharedFile);
关于java - 无法获取相机 PutExtra 方法的文件 Uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47786523/
在下面的 for 循环中,最后一个 putExtra 覆盖了第一个 putExtra,即使它们采用不同的参数和不同的变量。 首先:putExtra(String,String)第二:putExtra(
这个问题听起来可能很愚蠢,但我想知道我们什么时候将 Activity 名称放入 Intent.putExtra() 中?在一种情况下,我们仅将 extra 与 bundle 放在一起,而在另一种情况下
什么更快?将一堆字符串值添加到 bundle,然后将其添加到 intent?或者只是使用 intent.putExtra() 将值添加到 intent?还是差别不大? 谷歌搜索给了我教程,但没有太多答
我正在考虑我当前的应用程序。我有这个带有两个选项卡的 TabHost 类。Tab1 在 ListView 中显示来自 WS 的数据。 Tab2 在 webview 中显示与图表相同的数据。 当然,我不
基于 Searchable Dictionary示例 我尝试将额外的数据放入不同的 Activity 中。 public void onCreate(Bundle savedInstanceStat
我的问题是在 3 个 Activity 之间传递一个字符串。我解释一下我是如何做到的。 第一个名为 loginActiviy 的 Activity 是我执行此操作的地方。 //OnCreate e
我有一个要求,我想开发一个混合应用程序并列出蓝牙设备、扫描和连接、共享文件等。 所以我想将 BluetoothAdapter mAdapter 值添加到 extras 中并将其传递到 onActivi
我正在关注这个例子: http://developer.android.com/training/camera/photobasics.html 如果您为此 putExtra(MediaStore.E
好的 所以我想使用 getextrand putextra 方法将值从一个 Activity 传递到另一个 Activity 。 在我想要接收数据的第二个 Activity 中,充满了按钮和 Text
我在点击按钮时使用此操作调用 Activity: EditText text = (EditText) findViewById(R.id.codice); Intent intent = new I
我有 Intent,我从 MainActivity 将两个 ArrayLists 的 Parceables 传递给一个“FormActivity”,它接收 ArrayLists perfeclty(使
这是用于将数据发送到主 Activity 的函数。 public void sendData(){ String name = Bookname.getText().toString(
我想将 Intent 从第一个 Activity 发送到另一个 Activity 。 第一个 Activity 向第二个 Activity 发送一个 Intent 以创建一个新的 AlertDialo
我有多个变量要从一个 Activity 传递到另一个 Activity 。 我在第一个 Activity 中有这个: public void onClick(View v) { switch(
我有一个通知,当按下时应该启动一个 Activity ,该 Activity 又会启动一个对话框。这一切都有效,但对话框从通知中提取信息认为 Intent.putExtra()。问题是,它总是从 pu
这个问题在这里已经有了答案: Passing JSONObject to another activity via Intent [duplicate] (3 个答案) 关闭 5 年前。 如何使用p
我在 GCMIntentservice 中编写了一段代码,用于向许多用户发送推送通知。我使用的NotificationManager将在单击通知时调用DescriptionActivity类。我还将
我有一个代码,使用 putextra 方法将数据从 Activity 推送到另一个 Activity ,我想使用相同的键推送不同的值代码: String int_value = "int_value"
我有 2 项 Activity ,我正在尝试将第一个 Activity 中的值放入第二个 Activity 中。在第一个 Activity 中,我创建了一个带有 onClick 参数的按钮。 然后我
我正在尝试开发一个二维码扫描仪,我想向用户显示扫描结果的历史记录。现在,虽然扫描的数据值已正确传递到不同的 Activity ;它的问题是,即使我没有扫描 qr,空数据也会传递到下一个 Activit
我是一名优秀的程序员,十分优秀!