diff --git a/app/src/main/java/com/frank/ffmpeg/activity/BaseActivity.java b/app/src/main/java/com/frank/ffmpeg/activity/BaseActivity.java new file mode 100644 index 0000000..71c6451 --- /dev/null +++ b/app/src/main/java/com/frank/ffmpeg/activity/BaseActivity.java @@ -0,0 +1,90 @@ +package com.frank.ffmpeg.activity; + +import android.Manifest; +import android.content.Intent; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v7.app.AppCompatActivity; +import android.util.Log; +import android.view.View; + +import com.frank.ffmpeg.util.ContentUtil; + +public abstract class BaseActivity extends AppCompatActivity implements View.OnClickListener { + + private final static String TAG = BaseActivity.class.getSimpleName(); + + private final static int REQUEST_CODE = 1234; + private final static String[] permissions = new String[] { + Manifest.permission.WRITE_EXTERNAL_STORAGE, + Manifest.permission.READ_EXTERNAL_STORAGE}; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + initWindow(); + requestPermission(); + setContentView(getLayoutId()); + } + + private void initWindow() { + if (getSupportActionBar() != null) { + getSupportActionBar().hide(); + } + } + + private void requestPermission() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + requestPermissions(permissions, REQUEST_CODE); + } + } + + protected void initViews(int... viewIds) { + for (int viewId : viewIds) { + getView(viewId); + } + } + + protected void initViewsWithClick(int... viewIds) { + for (int viewId : viewIds) { + getView(viewId).setOnClickListener(this); + } + } + + @Override + public void onClick(View v) { + onViewClick(v); + } + + protected void selectFile() { + Intent intent = new Intent(Intent.ACTION_GET_CONTENT); + intent.addCategory(Intent.CATEGORY_OPENABLE); + intent.setType("*/*"); + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); + this.startActivityForResult(intent, 123); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if(data != null && data.getData() != null) { + String filePath = ContentUtil.getPath(this,data.getData()); + Log.i(TAG,"filePath="+ filePath); + onSelectedFile(filePath); + } + } + + protected T getView(int viewId) { + return (T) findViewById(viewId); + } + + abstract int getLayoutId(); + + abstract void onViewClick(View view); + + abstract void onSelectedFile(String filePath); + +} diff --git a/app/src/main/java/com/frank/ffmpeg/activity/MainActivity.java b/app/src/main/java/com/frank/ffmpeg/activity/MainActivity.java index ec97dd7..9baa0d8 100644 --- a/app/src/main/java/com/frank/ffmpeg/activity/MainActivity.java +++ b/app/src/main/java/com/frank/ffmpeg/activity/MainActivity.java @@ -1,11 +1,7 @@ package com.frank.ffmpeg.activity; -import android.Manifest; import android.content.Intent; -import android.content.pm.PackageManager; -import android.os.Build; import android.os.Bundle; -import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.animation.BounceInterpolator; @@ -19,37 +15,32 @@ import com.frank.ffmpeg.floating.Screen; * 使用ffmpeg进行音视频处理入口 * Created by frank on 2018/1/23. */ -public class MainActivity extends AppCompatActivity implements View.OnClickListener{ +public class MainActivity extends BaseActivity { - private final static String[] mPermissions = new String[]{ - Manifest.permission.WRITE_EXTERNAL_STORAGE, - Manifest.permission.READ_EXTERNAL_STORAGE - }; - private final static int CODE_STORAGE = 999; + @Override + int getLayoutId() { + return R.layout.activity_main; + } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - initView(); - checkPermission(); - } - - private void initView() { - findViewById(R.id.btn_audio).setOnClickListener(this); - findViewById(R.id.btn_video).setOnClickListener(this); - findViewById(R.id.btn_media).setOnClickListener(this); - findViewById(R.id.btn_play).setOnClickListener(this); - findViewById(R.id.btn_push).setOnClickListener(this); - findViewById(R.id.btn_live).setOnClickListener(this); - findViewById(R.id.btn_filter).setOnClickListener(this); - findViewById(R.id.btn_reverse).setOnClickListener(this); - findViewById(R.id.btn_floating).setOnClickListener(this); + initViewsWithClick( + R.id.btn_audio, + R.id.btn_video, + R.id.btn_media, + R.id.btn_play, + R.id.btn_push, + R.id.btn_live, + R.id.btn_filter, + R.id.btn_reverse, + R.id.btn_floating + ); } @Override - public void onClick(View v) { + public void onViewClick(View v) { Intent intent = new Intent(); switch (v.getId()){ case R.id.btn_audio://音频处理 @@ -85,15 +76,6 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe startActivity(intent); } - //动态申请权限 - private void checkPermission(){ - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (checkSelfPermission(mPermissions[0]) != PackageManager.PERMISSION_GRANTED){ - requestPermissions(mPermissions, CODE_STORAGE); - } - } - } - /** * 悬浮窗播放 */ @@ -116,4 +98,9 @@ public class MainActivity extends AppCompatActivity implements View.OnClickListe FloatWindow.get().show(); } + @Override + void onSelectedFile(String filePath) { + + } + } diff --git a/app/src/main/java/com/frank/ffmpeg/util/ContentUtil.java b/app/src/main/java/com/frank/ffmpeg/util/ContentUtil.java new file mode 100644 index 0000000..f0db52f --- /dev/null +++ b/app/src/main/java/com/frank/ffmpeg/util/ContentUtil.java @@ -0,0 +1,135 @@ +package com.frank.ffmpeg.util; + +import android.annotation.TargetApi; +import android.content.ContentUris; +import android.content.Context; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.provider.DocumentsContract; +import android.provider.MediaStore; + +public class ContentUtil { + + /** + * Get a file path from a Uri. This will get the the path for Storage + * Access Framework Documents. + * @param context The context + * @param uri The Uri to query + */ + @TargetApi(Build.VERSION_CODES.KITKAT) + public static String getPath(final Context context, final Uri uri) { + + // DocumentProvider + if (DocumentsContract.isDocumentUri(context, uri)) { + // ExternalStorageProvider + if (isExternalStorageDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + if ("primary".equalsIgnoreCase(type)) { + return Environment.getExternalStorageDirectory() + "/" + split[1]; + } + } + // DownloadsProvider + else if (isDownloadsDocument(uri)) { + + final String id = DocumentsContract.getDocumentId(uri); + final Uri contentUri = ContentUris.withAppendedId( + Uri.parse("content://downloads/public_downloads"), Long.valueOf(id)); + + return getDataColumn(context, contentUri, null, null); + } + // MediaProvider + else if (isMediaDocument(uri)) { + final String docId = DocumentsContract.getDocumentId(uri); + final String[] split = docId.split(":"); + final String type = split[0]; + + Uri contentUri = null; + if ("image".equals(type)) { + contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; + } else if ("video".equals(type)) { + contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; + } else if ("audio".equals(type)) { + contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; + } + + final String selection = "_id=?"; + final String[] selectionArgs = new String[] { + split[1] + }; + + return getDataColumn(context, contentUri, selection, selectionArgs); + } + } + // MediaStore (and general) + else if ("content".equalsIgnoreCase(uri.getScheme())) { + return getDataColumn(context, uri, null, null); + } + // File + else if ("file".equalsIgnoreCase(uri.getScheme())) { + return uri.getPath(); + } + return null; + } + /** + ** + * Get the value of the data column for this Uri. This is useful for + * MediaStore Uris, and other file-based ContentProviders. + * + * @param context The context + * @param uri The Uri to query + * @param selection (Optional) Filter used in the query. + * @param selectionArgs (Optional) Selection arguments used in the query. + * @return The value of the _data column, which is typically a file path. + */ + private static String getDataColumn(Context context, Uri uri, String selection, + String[] selectionArgs) { + Cursor cursor = null; + final String column = "_data"; + final String[] projection = { + column + }; + + try { + cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, + null); + if (cursor != null && cursor.moveToFirst()) { + final int index = cursor.getColumnIndexOrThrow(column); + return cursor.getString(index); + } + } finally { + if (cursor != null) + cursor.close(); + } + return null; + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is ExternalStorageProvider. + */ + private static boolean isExternalStorageDocument(Uri uri) { + return "com.android.externalstorage.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is DownloadsProvider. + */ + private static boolean isDownloadsDocument(Uri uri) { + return "com.android.providers.downloads.documents".equals(uri.getAuthority()); + } + + /** + * @param uri The Uri to check. + * @return Whether the Uri authority is MediaProvider. + */ + private static boolean isMediaDocument(Uri uri) { + return "com.android.providers.media.documents".equals(uri.getAuthority()); + } + +}