解析错误,在启动意图安装APK后发生。

huangapple go评论112阅读模式
英文:

parsing error after launching intent to install apk

问题

以下是您提供的代码的翻译部分:

  1. public void onClickUpdate(View view) throws IOException {
  2. Toast.makeText(SettingsActivity.this, "正在检查更新", Toast.LENGTH_SHORT).show();
  3. OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS)
  4. .writeTimeout(10, TimeUnit.SECONDS).readTimeout(10, TimeUnit.SECONDS).build();
  5. final Request request = new Request.Builder().url("theurl").addHeader("version", version).get().build();
  6. client.newCall(request).enqueue(new Callback() {
  7. @Override
  8. public void onFailure(@NotNull Call call, @NotNull IOException e) {
  9. e.printStackTrace();
  10. }
  11. @Override
  12. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  13. try {
  14. File sdcard = new File("sdcard/Download");
  15. File file = new File(sdcard, "app-debug.apk");
  16. file.createNewFile();
  17. BufferedSink sink = Okio.buffer(Okio.sink(file));
  18. sink.writeAll(Objects.requireNonNull(response.body()).source());
  19. sink.close();
  20. runOnUiThread(new Runnable() {
  21. @Override
  22. public void run() {
  23. Toast.makeText(SettingsActivity.this, "安装成功!", Toast.LENGTH_LONG).show();
  24. try {
  25. Intent intent = new Intent(Intent.ACTION_VIEW);
  26. intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  27. Uri uri = Uri.parse("content://" + "sdcard/Download/app-debug.apk");
  28. intent.setDataAndType(uri, "application/vnd.android.package-archive");
  29. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  30. startActivity(intent);
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. });
  36. } catch (Exception e) {
  37. e.printStackTrace();
  38. } finally {
  39. response.close();
  40. }
  41. }
  42. });
  43. }

AndroidManifest.xml:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. xmlns:tools="http://schemas.android.com/tools"
  4. package="com.testapp.test">
  5. <uses-permission android:name="android.permission.INTERNET"/>
  6. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  7. <uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
  8. <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  9. <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  10. <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
  11. <application
  12. android:allowBackup="false"
  13. android:icon="@mipmap/ic_launcher"
  14. android:label="@string/app_name"
  15. android:roundIcon="@mipmap/ic_launcher_round"
  16. android:supportsRtl="true"
  17. android:theme="@style/AppTheme">
  18. <activity android:name=".VersionActivity">
  19. </activity>
  20. <activity android:name=".SettingsActivity">
  21. </activity>
  22. <activity android:name=".MainActivity">
  23. <intent-filter>
  24. <action android:name="android.intent.action.MAIN"/>
  25. <category android:name="android.intent.category.LAUNCHER"/>
  26. </intent-filter>
  27. </activity>
  28. </application>
  29. </manifest>

日志:
2020-09-29 07:31:13.669 24595-29726/? E/ActivityThread: 无法找到 sdcard 的内容提供程序信息
2020-09-29 07:31:13.671 24595-29726/? W/InstallStaging: 从内容 URI 进行分阶段 apk 时出错
java.io.FileNotFoundException: 无内容提供程序: content://sdcard/Download/app-debug.apk
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1506)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1357)
at android.content.ContentResolver.openInputStream(ContentResolver.java:1071)
at com.android.packageinstaller.InstallStaging$StagingAsyncTask.doInBackground(InstallStaging.java:167)
at com.android.packageinstaller.InstallStaging$StagingAsyncTask.doInBackground(InstallStaging.java:161)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

  1. <details>
  2. <summary>英文:</summary>
  3. So i have a function which downloads and then installs the apk. When the intent launches I get &quot;There was a problem parsing this package.&quot; error. However,if i try installing it manually it works fine.
  4. DownloadActivity.java:

public void onClickUpdate(View view) throws IOException {
Toast.makeText(SettingsActivity.this, "Checking for updates", Toast.LENGTH_SHORT).show();
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10,TimeUnit.SECONDS).readTimeout(10,TimeUnit.SECONDS).build();
final Request request=new Request.Builder().url("theurl").addHeader("version",version).get().build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
e.printStackTrace();
}

  1. @Override
  2. public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
  3. try {
  4. File sdcard=new File(&quot;sdcard/Download&quot;);
  5. File file=new File(sdcard,&quot;app-debug.apk&quot;);
  6. file.createNewFile();
  7. BufferedSink sink=Okio.buffer(Okio.sink(file));
  8. sink.writeAll(Objects.requireNonNull(response.body()).source());
  9. sink.close();
  10. runOnUiThread(new Runnable() {
  11. @Override
  12. public void run() {
  13. Toast.makeText(SettingsActivity.this, &quot;Installed successfully!&quot;, Toast.LENGTH_LONG).show();
  14. try{
  15. Intent intent=new Intent(Intent.ACTION_VIEW);
  16. intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
  17. Uri uri=Uri.parse(&quot;content://&quot;+&quot;sdcard/Download/app-debug.apk&quot;);
  18. intent.setDataAndType(uri, &quot;application/vnd.android.package-archive&quot;);
  19. intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
  20. startActivity(intent);}catch (Exception e){
  21. e.printStackTrace();
  22. }
  23. }
  24. });
  25. } catch (Exception e) {
  26. e.printStackTrace();
  27. }finally {
  28. response.close();
  29. }
  30. }
  31. });
  32. }
  1. AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.testapp.test">
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>

  1. &lt;application
  2. android:allowBackup=&quot;false&quot;
  3. android:icon=&quot;@mipmap/ic_launcher&quot;
  4. android:label=&quot;@string/app_name&quot;
  5. android:roundIcon=&quot;@mipmap/ic_launcher_round&quot;
  6. android:supportsRtl=&quot;true&quot;
  7. android:theme=&quot;@style/AppTheme&quot;&gt;
  8. &lt;activity android:name=&quot;.VersionActivity&quot;&gt;
  9. &lt;/activity&gt;
  10. &lt;activity android:name=&quot;.SettingsActivity&quot;&gt;
  11. &lt;/activity&gt;
  12. &lt;activity android:name=&quot;.MainActivity&quot;&gt;
  13. &lt;intent-filter&gt;
  14. &lt;action android:name=&quot;android.intent.action.MAIN&quot;/&gt;
  15. &lt;category android:name=&quot;android.intent.category.LAUNCHER&quot;/&gt;
  16. &lt;/intent-filter&gt;
  17. &lt;/activity&gt;
  18. &lt;/application&gt;

</manifest>

  1. Also I did try https://stackoverflow.com/questions/37253879/android-install-apk-programmatically-error-package-parse-error but that did not help at all.
  2. the logs:
  3. 2020-09-29 07:31:13.669 24595-29726/? E/ActivityThread: Failed to find provider info for sdcard
  4. 2020-09-29 07:31:13.671 24595-29726/? W/InstallStaging: Error staging apk from content URI
  5. java.io.FileNotFoundException: No content provider: content://sdcard/Download/app-debug.apk
  6. at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1506)
  7. at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:1357)
  8. at android.content.ContentResolver.openInputStream(ContentResolver.java:1071)
  9. at com.android.packageinstaller.InstallStaging$StagingAsyncTask.doInBackground(InstallStaging.java:167)
  10. at com.android.packageinstaller.InstallStaging$StagingAsyncTask.doInBackground(InstallStaging.java:161)
  11. at android.os.AsyncTask$2.call(AsyncTask.java:333)
  12. at java.util.concurrent.FutureTask.run(FutureTask.java:266)
  13. at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
  14. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
  15. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
  16. at java.lang.Thread.run(Thread.java:764)
  17. </details>
  18. # 答案1
  19. **得分**: 0
  20. 我通过添加以下内容进行了修复:
  21. ```java
  22. StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
  23. StrictMode.setVmPolicy(builder.build());
  24. builder.detectFileUriExposure();

我不建议这样做。
尝试将文件URI包装在content://中,而不是这样做。

英文:

I fixed it by adding this:

  1. StrictMode.VmPolicy.Builder builder=new StrictMode.VmPolicy.Builder();
  2. StrictMode.setVmPolicy(builder.build());
  3. builder.detectFileUriExposure;

I don't recommend doing this.
Try wrapping your file URI with content:// instead.

huangapple
  • 本文由 发表于 2020年9月29日 20:14:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/64119406.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定