gpt4 book ai didi

java - Android 使用内容提供程序从 Assets 文件夹发送图像?

转载 作者:行者123 更新时间:2023-12-01 11:41:37 25 4
gpt4 key购买 nike

您好~我正在尝试通过一般 Intent 从应用程序中的 Assets 文件夹发送图像(因此用户可以将图像发送到接受此类 Intent 的任何其他应用程序,包括 SMS、Facebook 和 Twitter) .

环顾四周后,我发现了这个StackOverflow question 。它似乎工作得很好,在关注了一些评论之后,该方法似乎并没有被弃用。然而,我的问题是我无法让它工作。发生的情况是,我成功地从 Intent 选择器对话框中选择了一个应用程序,但是一旦选择了应用程序,我就会收到一条消息,提示“找不到照片”。

这是我当前的代码...

AndroidManifest.xml:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mdstudios.diabeticons" >

<provider
android:name="com.mdstudios.diabeticons.Utils.AssetsProvider"
android:authorities="com.mdstudios.diabeticons"
android:grantUriPermissions="true"
android:exported="true" />

<application
...

AssetsProvider.java:

package com.mdstudios.diabeticons.Utils;

import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.database.Cursor;
import android.net.Uri;
import android.os.CancellationSignal;
import android.util.Log;

import java.io.FileNotFoundException;
import java.io.IOException;

/**
* Created by jawad on 06/04/15.
*/
public class AssetsProvider extends ContentProvider {
private static final String LOGTAG = "MD/AssetsProvider";

@Override
public AssetFileDescriptor openAssetFile( Uri uri, String mode ) throws FileNotFoundException
{
Log.v(LOGTAG, "AssetsGetter: Open asset file");

AssetManager am = getContext( ).getAssets( );

String file_name = uri.getPath().substring(1, uri.getPath().length());
//String file_name = uri.getLastPathSegment();
// Neither of the two lines above work for me

if( file_name == null )
throw new FileNotFoundException( );

AssetFileDescriptor afd = null;

try
{
afd = am.openFd( file_name );
}
catch(IOException e)
{
e.printStackTrace( );
}

return afd;//super.openAssetFile(uri, mode);
}

@Override
public String getType( Uri p1 )
{
// TODO: Implement this method
return null;
}

@Override
public int delete( Uri p1, String p2, String[] p3 )
{
// TODO: Implement this method
return 0;
}

@Override
public Cursor query( Uri p1, String[] p2, String p3, String[] p4, String p5 )
{
// TODO: Implement this method
return null;
}

@Override
public Cursor query( Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder, CancellationSignal cancellationSignal )
{
// TODO: Implement this method
return super.query( uri, projection, selection, selectionArgs, sortOrder, cancellationSignal );
}

@Override
public Uri insert( Uri p1, ContentValues p2 )
{
// TODO: Implement this method
return null;
}

@Override
public boolean onCreate( )
{
// TODO: Implement this method
return false;
}

@Override
public int update( Uri p1, ContentValues p2, String p3, String[] p4 )
{
// TODO: Implement this method
return 0;
}
}

SendActivity.java:

// Sends an intent to share the image that was passed to this Activity
private void sendImage() {
Log.d(LOGTAG, mFilePath);
Uri theUri = Uri.parse("content://com.mdstudios.diabeticons/" + mFilePath);
// Tried file path with subfolder and non-subfolder images

Intent theIntent = new Intent(Intent.ACTION_SEND);
theIntent.setType("image/*");
theIntent.putExtra(Intent.EXTRA_STREAM,theUri);
theIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,"Subject for message");
theIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Body for message");
startActivity(theIntent);
}

我不确定我做错了什么。我尝试发送的图像位于子文件夹中(即“folder/image1.png”)。但是,我尝试使用任何子文件夹之外的图像(即,将图像复制到任何 Assets 子文件夹之外后,将文件路径简单地使用“image1.png”)。此外,在原始 SO 问题的评论中,我似乎必须使用不同的方式从 Uri 获取文件路径。原始方法和新方法(在 AssetsProvider 类的注释中指出)都不起作用。

感谢您提供的所有帮助!

编辑:经过更多查看后,我发现这里有一个类似的问题帖子,但没有回复。然后我更深入地查看了我的 logcat,发现了一个错误:

04-06 14:30:54.773  18883-19532/? E/Babel﹕ java.io.FileNotFoundException: No content provider: content://com.mdstudios.diabeticons/Banana.png
at android.content.ContentResolver.openTypedAssetFileDescriptor(ContentResolver.java:1060)
at android.content.ContentResolver.openAssetFileDescriptor(ContentResolver.java:914)
at android.content.ContentResolver.openInputStream(ContentResolver.java:639)
at ajz.a(SourceFile:5280)
at ajz.doInBackgroundTimed(SourceFile:5066)
at dsn.doInBackground(SourceFile:65)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)

我仍然不确定如何解决这个问题(尽管我仍在继续修补它),所以任何帮助仍然将不胜感激!谢谢!

最佳答案

感谢 CommonsWare,我在这里意识到了这个问题。问题在于提供程序应该在 list 中声明,特别是在应用程序标记之间。

所以, list 应该如下所示......

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mdstudios.diabeticons" >

<application>
<provider
android:name="com.mdstudios.diabeticons.Utils.AssetsProvider"
android:authorities="com.mdstudios.diabeticons"
android:grantUriPermissions="true"
android:exported="true" />
</application>

</manifest>

请注意,在我在问题中发布的代码中,提供程序位于 list 标记之间但在应用程序标记之外(类似于声明权限的位置)。相反,提供程序声明必须位于应用程序标记之间,就像声明“Activity ”的位置一样。

关于java - Android 使用内容提供程序从 Assets 文件夹发送图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29477209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com