1

IntentACTION_GET_CONTENTを使用して、電話のメモリから最近のファイルを表示しました。これには、下のスクリーンショットに示すように、画像、pdf、Google ドライブ ドキュメント (pdf、xlsx) が含まれます。ファイルをサーバーにアップロードできるように、名前とフルパスを取得したいと思います。現在、MIME タイプを正しく取得しています。

public class MainActivity extends AppCompatActivity {

    Button btn;
    TextView txt;
    private final static int EXTERNAL = 111;
    private final static int ATTACH = 11;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        btn = (Button)findViewById(R.id.btn);
        txt = (TextView)findViewById(R.id.txt);

        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                    if (ContextCompat.checkSelfPermission(MainActivity.this, android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
                        photoIntent();
                    } else {
                        if (shouldShowRequestPermissionRationale(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                            // showToast("Permission Required...");
                        }
                        requestPermissions(new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, EXTERNAL);
                    }


                } else {

                    photoIntent();
                }
            }
        });



    }

    private void photoIntent() {
        Intent intent = new Intent();
        Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath());
        intent.setDataAndType(uri, "*/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent, "Complete action using"), ATTACH);
    }

    @Override
    public void onRequestPermissionsResult(int requestcode, String[] permission, int[] grantRes){

        if (requestcode == EXTERNAL) {
            if (grantRes[0] == PackageManager.PERMISSION_GRANTED) {
                photoIntent();
            } else {
                Toast.makeText(this, "Unable to Access Image", Toast.LENGTH_SHORT).show();
            }
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == ATTACH && resultCode == RESULT_OK){
            Uri uri = data.getData();
            System.out.println("sammy_sourceUri "+uri);
            String mimeType = getContentResolver().getType(uri);
            System.out.println("sammy_mimeType "+ mimeType);
            


        }

    }
}

ここに画像の説明を入力

4

3 に答える 3

1

ファイルをサーバーにアップロードできるように、名前とフルパスを取得したい

「ファイル」が存在しない可能性があるため、「フルパス」はありません。

を呼び出してACTION_GET_CONTENTいます。Uriこれは、あるコンテンツに a を返します。そのコンテンツがどこから来るかはACTION_GET_CONTENT、ユーザーが選択したアクティビティの開発者次第です。それは次のようになります。

  • たまたまアクセスできるファイルシステム上の通常のファイル
  • 他のアプリの内部ストレージなど、アクセスできない場所に存在するファイルシステム上の通常のファイル
  • 復号化など、何らかの変換を必要とするファイル
  • BLOBデータベース内の列
  • その場で生成されるコンテンツ、この Web ページが Stack Overflow サーバーによってその場で生成される方法
  • 等々

のコンテンツを使用するには、とをUri使用します。ContentResolveropenInputStream()

この InputStream を使用してサーバー API にファイルとしてアップロードする方法は?

選択した HTTP API が、InputStreamこのコンテンツのソースとして をサポートしているか、サポートしていないかのいずれかです。その場合は、InputStream直接使用してください。そうでない場合は、 を使用して、直接アクセスできるInputStreamファイルとしてコンテンツの一時コピーを作成し(たとえば、 で)、そのファイルをアップロードし、アップロードが完了したらファイルを削除します。getCacheDir()

于 2016-12-14T11:17:20.017 に答える
0

URI から実際のパスを取得する

public String getRealPathFromURI(Uri contentUri) 
{
     String[] proj = { MediaStore.Audio.Media.DATA };
     Cursor cursor = managedQuery(contentUri, proj, null, null, null);
     int column_index = cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA);
     cursor.moveToFirst();
     return cursor.getString(column_index);
}

ファイル名 :

String filename = path.substring(path.lastIndexOf("/")+1);
于 2016-12-14T11:50:34.553 に答える