代码之家  ›  专栏  ›  技术社区  ›  Attaullah

如何从文件资源管理器在我的应用程序中打开单个图像

  •  2
  • Attaullah  · 技术社区  · 8 年前

    我正在开发一个应用程序,在这个应用程序中,我想从外部文件浏览器打开应用程序中的任何照片。就像当我点击照片时,选择应用程序窗口出现,我选择我的应用程序,图像显示在我的应用中。但在这里,没有图像出现。

    我在中添加了代码 Manifest.xml :

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
            <activity
                android:name="com.image.MainActivity"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
                <intent-filter>
                    <action android:name="android.intent.action.SEND" />
                    <action android:name="android.intent.action.VIEW" />
                    <action android:name="android.intent.action.EDIT" />
    
                    <category android:name="android.intent.category.BROWSABLE" />
                    <category android:name="android.intent.category.DEFAULT" />
    
                    <data android:mimeType="image/*" />
                    <data android:mimeType="text/*" />
                </intent-filter>
            </activity>
    </application>
    

    布局文件 activity_main.xml

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:padding="10dp"
        tools:context=".DataReceiverActivity" >
    
        <ImageView
            android:id="@+id/picture"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:contentDescription="Receive Picture Sharing" />
    
        <TextView
            android:id="@+id/txt"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent" />
    
    </RelativeLayout>
    

    在我的 MainActivity.java :

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ImageView picView = (ImageView) findViewById(R.id.picture);
            TextView txtView = (TextView) findViewById(R.id.txt);
    
            Intent receivedIntent = getIntent();
            String receivedAction = receivedIntent.getAction();
            String receivedType = receivedIntent.getType();
    
            // make sure it's an action and type we can handle
            if (receivedAction.equals(Intent.ACTION_SEND)) {
                if (receivedType.startsWith("text/")) {
                    picView.setVisibility(View.GONE);
                    String receivedText = receivedIntent
                        .getStringExtra(Intent.EXTRA_TEXT);
                    if (receivedText != null) {
                        txtView.setText(receivedText);
                    }
                } else if (receivedType.startsWith("image/")) {
                    txtView.setVisibility(View.GONE);
                    Uri receivedUri = (Uri) receivedIntent
                        .getParcelableExtra(Intent.EXTRA_STREAM);
                    if (receivedUri != null) {
                        picView.setImageURI(receivedUri);// just for demonstration
                    }
                }
            } else if (receivedAction.equals(Intent.ACTION_VIEW)) {
    
                if (receivedType.startsWith("text/")) {
                    Toast.makeText(this, "TextRecived", Toast.LENGTH_SHORT).show();
                    Uri uri2 = receivedIntent.getData();
                    String uri = uri2.getEncodedPath() + "  complete: "
                        + uri2.toString();
                    txtView.setText(uri);
                } else if (receivedType.startsWith("image/")) {
    
                    txtView.setVisibility(View.GONE);
                    Uri receivedUri = (Uri) receivedIntent
                        .getParcelableExtra(Intent.EXTRA_STREAM);
                    Toast.makeText(this, receivedUri.toString(), Toast.LENGTH_SHORT).show();
                    if (receivedUri != null) {
                        picView.setImageURI(receivedUri);// just for demonstration
                    }
                }
            } else if (receivedAction.equals(Intent.ACTION_MAIN)) {
                txtView.setText("-----------------------------");
            }
        }
    
    }
    

    以下是我的截图:

    opening image from explorer when selecting my app empty screen appare

    1 回复  |  直到 7 年前
        1
  •  1
  •   Anirudha Agashe    8 年前

    问题是你试图 Uri 以错误的方式。更改的所有出现次数

    Uri receivedUri = (Uri) receivedIntent.getParcelableExtra(Intent.EXTRA_STREAM);
    

     Uri receivedUri = receivedIntent.getData();
    

    这会给你正确的答案 乌里 文件的。还要注意 setImageURI

    UI线程上的位图读取和解码

    参考 this 链接了解更多详细信息。